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?

Civatrix
źródło
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
zanbri
źródło
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"
GMD
źródło
25

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

File.open("out.txt", "w+") { |file| file.write("boo!") }
Chris Bunch
źródło
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.

Tomek
źródło
11

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

Sama wpadłem na to jakiś czas temu.

nterry
źródło
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 .

Blaszany Człowiek
źródło
Ś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"
Nicola Mingotti
źródło
1
data = 'data you want inside the file'.

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

ispirett
źródło
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

Alex Tamoykin
źródło