Come creare un file in Ruby


170

Sto cercando di creare un nuovo file e le cose non sembrano funzionare come mi aspetto anch'io. Ecco cosa ho provato:

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

Secondo tutto quello che ho letto online tutti dovrebbero funzionare, ma ognuno di loro mi dà questo:

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

Questo succede da IRB e da uno script Ruby. Cosa mi sto perdendo?


13
I primi due non dovrebbero funzionare, ma i secondi due sono sinonimi e sicuramente dovrebbero funzionare.
Andrew Marshall,

@Andrew: stai pensando che solo i primi due sono stati provati?
mu è troppo corto il

1
@muistooshort Questa è l'unica conclusione che posso raggiungere. Un errore di autorizzazioni avrebbe generato Errno::EACCES, no ENOENT.
Andrew Marshall,

2
OK, ora mi sento stupido. I primi due sicuramente non funzionano ma i secondi due lo fanno. Non sono sicuro di come ho convinto me stesso di averli provati. Ci scusiamo per aver perso tempo a tutti.
Civatrix,

1
@Civatrix Non è un problema. Tutti perdiamo tempo a volte.
Darth Egregious,

Risposte:


434

Uso:

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

dove sono le tue opzioni:

  • r- Sola lettura. Il file deve esistere.
  • w - Crea un file vuoto per la scrittura.
  • a - Aggiungi a un file. Il file viene creato se non esiste.
  • r+- Apri un file per l'aggiornamento sia in lettura che in scrittura. Il file deve esistere.
  • w+ - Crea un file vuoto sia per la lettura che per la scrittura.
  • a+- Apri un file per la lettura e l'aggiunta. Il file viene creato se non esiste.

Nel tuo caso, 'w'è preferibile.

O potresti avere:

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

11
Bella risposta. Ruben Conevntion è un caso serpente per i nomi delle varianti. Solo un avvertimento per i neofiti. outFiledovrebbe apparire come out_file.
Adam Waite,

3
@AdamWaite Ho modificato la risposta secondo il tuo suggerimento snake_case, lasciando questo commento come contesto.
Kris

3
@zanbri - cosa succede se non chiudo il file?
Erran Morad,

1
ottima risposta, completa e breve
Boris,

2
@BoratSagdiyev "Un oggetto File a cui non viene più fatto riferimento diventa idoneo per la garbage collection. Il file verrà chiuso automaticamente quando l'oggetto File viene garbage collection." rootr.net/rubyfaq-9.html
jkdev

35

Provare

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

senza usare il

File.new "out.txt"

25

Prova a utilizzare "w+"la modalità di scrittura anziché semplicemente "w":

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

4
Dipende se si desidera scrivere solo ( w) o entrambi read e write ( w+).
jkdev,

20

OK, ora mi sento stupido. I primi due sicuramente non funzionano ma i secondi due lo fanno. Non sono sicuro di come ho convinto me stesso di averli provati. Ci scusiamo per aver perso tempo a tutti.

Nel caso in cui ciò aiuti chiunque altro, ciò può verificarsi quando si tenta di creare un nuovo file in una directory che non esiste.


11

La directory non esiste. Assicurati che esista perché opennon creerà quelle directory per te.

Mi sono imbattuto in questo un po 'di tempo fa.


11

File.newe File.openimpostazione predefinita di leggere mode ( 'r') come meccanismo di sicurezza, per evitare la possibilità di sovrascrivere un file. Dobbiamo dire esplicitamente a Ruby di utilizzare la modalità di scrittura ( 'w'è il modo più comune) se eseguiremo l'output nel file.

Se il testo da emettere è una stringa, anziché scrivere:

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

o peggio:

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

Usa il più succinto write:

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

writeha permesso modalità in modo che possiamo usare 'w', 'a', 'r+'se necessario.

opencon un blocco è utile se devi calcolare l'output in un ciclo iterativo e vuoi lasciare il file aperto mentre lo fai. writeè utile se hai intenzione di produrre il contenuto in un colpo solo, quindi chiudere il file.

Vedere la documentazione per ulteriori informazioni.


Ottima risposta, questo è il modo più idiomatico e quindi "rubino". Dovrebbe essere la risposta migliore.
Gino,

Bene, sono d'accordo. Uso raramente il modulo a blocchi per scrivere file. È troppo visivamente rumoroso.
Tin Man,

11

Se l'obiettivo è solo quello di creare un file, il modo più diretto che vedo è:

 FileUtils.touch "foobar.txt"

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

Puoi usare File.write('name of file here', data)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.