Jak stworzyć plik w Rubim


170

Próbuję utworzyć nowy plik i wydaje się, że rzeczy nie działają tak, jak się tego spodziewam. Oto, czego próbowałem:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

Według wszystkiego, co przeczytałem w Internecie, wszystkie powinny działać, ale każdy z nich daje mi to:

ERRNO::ENOENT: No such file or directory - out.txt

Dzieje się to zarówno z IRB, jak i skryptu Ruby. czego mi brakuje?


13
Pierwsze dwa nie powinny działać, ale drugie dwa są synonimami i zdecydowanie powinny działać.
Andrew Marshall

@Andrew: Myślisz, że próbowano tylko dwóch pierwszych?
mu jest za krótkie

1
@muistooshort To jedyny wniosek, do którego mogę dojść. Wystąpiłby błąd uprawnień Errno::EACCES, ale nie ENOENT.
Andrew Marshall,

2
OK, teraz czuję się głupio. Pierwsze dwa zdecydowanie nie działają, ale drugie dwa. Nie jestem pewien, jak przekonałem się, że je wypróbowałem. Przepraszam za marnowanie czasu wszystkich.
Civatrix

1
@Civatrix To nie jest problem. Wszyscy czasem tracimy czas.
Darth Egregious

Odpowiedzi:


434

Posługiwać się:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

gdzie są twoje opcje:

  • r- Tylko czytać. Plik musi istnieć.
  • w - Utwórz pusty plik do zapisu.
  • a - Dołącz do pliku Plik jest tworzony, jeśli nie istnieje.
  • r+- Otwórz plik do aktualizacji zarówno do odczytu, jak i do zapisu. Plik musi istnieć.
  • w+ - Utwórz pusty plik do odczytu i zapisu.
  • a+- Otwórz plik do odczytu i dołączenia. Plik jest tworzony, jeśli nie istnieje.

W twoim przypadku 'w'jest lepsze.

LUB możesz mieć:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close

11
świetna odpowiedź. Konwencją rubinową jest wąż dla nazw var. Tylko ostrzeżenie dla początkujących. outFilepowinien wyglądać out_file.
Adam Waite

3
@AdamWaite Zredagowałem odpowiedź zgodnie z twoją sugestią snake_case, pozostawiając ten komentarz dla kontekstu.
Kris

3
@zanbri - co się stanie, jeśli nie zamknę pliku?
Erran Morad

1
świetna odpowiedź, wyczerpująca i krótka
Boris

2
@BoratSagdiyev "Obiekt File, do którego nie ma już odniesienia, kwalifikuje się do czyszczenia pamięci. Plik zostanie automatycznie zamknięty, gdy obiekt File zostanie usunięty." rootr.net/rubyfaq-9.html
jkdev

35

Próbować

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end

bez użycia

File.new "out.txt"

25

Spróbuj użyć "w+"jako trybu zapisu zamiast po prostu "w":

File.open("out.txt", "w+") { |file| file.write("boo!") }

4
Zależy, czy chcesz pisać tylko ( w), czy jednocześnie czytać i pisać ( w+).
jkdev

20

OK, teraz czuję się głupio. Pierwsze dwa zdecydowanie nie działają, ale drugie dwa. Nie jestem pewien, jak przekonałem się, że je wypróbowałem. Przepraszam za marnowanie czasu wszystkich.

Jeśli pomoże to komukolwiek innemu, może się tak zdarzyć, gdy próbujesz utworzyć nowy plik w katalogu, który nie istnieje.


11

Katalog nie istnieje. Upewnij się, że istnieje, ponieważ opennie utworzy dla Ciebie tych książek.

Sama wpadłem na to jakiś czas temu.


11

File.newi File.opendomyślnie odczytuje tryb ( 'r') jako mechanizm bezpieczeństwa, aby uniknąć ewentualnego nadpisania pliku. Musimy wyraźnie powiedzieć Ruby'emu, aby używał trybu zapisu ( 'w'jest to najbardziej powszechny sposób), jeśli mamy zamiar wyprowadzać dane do pliku.

Jeśli tekst do wyprowadzenia jest łańcuchem, zamiast pisać:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

albo gorzej:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

Użyj bardziej zwięzłego write:

File.write('foo.txt', 'bar')

writema tryby wolno więc możemy użyć 'w', 'a', 'r+'jeśli to konieczne.

openz blokiem jest przydatne, jeśli musisz obliczyć wynik w pętli iteracyjnej i chcesz pozostawić plik otwarty, gdy to robisz. writejest przydatne, jeśli zamierzasz wyprowadzić zawartość za jednym razem, a następnie zamknij plik.

Więcej informacji można znaleźć w dokumentacji .


Świetna odpowiedź, to najbardziej idiomatyczny, a więc "rubistowski" sposób. Powinna być najlepsza odpowiedź.
Gino

Cóż, zgadzam się. Rzadko używam formularza blokowego do zapisywania plików. Jest zbyt głośny wizualnie.
Tin Man

11

Jeśli celem jest tylko utworzenie pliku, najbardziej bezpośrednim sposobem jest:

 FileUtils.touch "foobar.txt"

1
data = 'data you want inside the file'.

Możesz użyć File.write('name of file here', data)


0

Możesz także użyć stałych zamiast ciągów, aby określić żądany tryb. Korzyścią jest to, że jeśli popełnisz literówkę w stałej nazwie, Twój program zgłosi wyjątek w czasie wykonywania.

Stałe to File::RDONLYlub File::WRONLYlub File::CREAT. Możesz je również łączyć, jeśli chcesz.

Pełny opis trybów otwierania plików na ruby-doc.org

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.