Comment créer un fichier dans Ruby


170

J'essaie de créer un nouveau fichier et les choses ne semblent pas fonctionner comme je m'y attendais. Voici ce que j'ai essayé:

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

Selon tout ce que j'ai lu en ligne, tout cela devrait fonctionner, mais chacun d'entre eux me donne ceci:

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

Cela se produit à partir d'IRB ainsi que d'un script Ruby. Qu'est-ce que je rate?


13
Les deux premiers ne devraient pas fonctionner, mais les deux seconds sont synonymes et devraient certainement fonctionner.
Andrew Marshall

@Andrew: Vous pensez que seuls les deux premiers ont été essayés?
mu est trop court

1
@muistooshort C'est la seule conclusion que je puisse tirer. Une erreur d'autorisations se serait produite Errno::EACCES, non ENOENT.
Andrew Marshall

2
OK, maintenant je me sens stupide. Les deux premiers ne fonctionnent certainement pas mais les deux seconds le font. Je ne sais pas comment je me suis convaincu que je les avais essayés. Désolé de perdre le temps de tout le monde.
Civatrix

1
@Civatrix Ce n'est pas un problème. Nous perdons tous parfois du temps.
Darth Egregious

Réponses:


434

Utilisation:

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

où sont vos options:

  • r- Lecture seulement. Le fichier doit exister.
  • w - Créez un fichier vide pour l'écriture.
  • a - Ajouter à un fichier. Le fichier est créé s'il n'existe pas.
  • r+- Ouvrez un fichier pour la mise à jour en lecture et en écriture. Le fichier doit exister.
  • w+ - Créez un fichier vide pour la lecture et l'écriture.
  • a+- Ouvrez un fichier à lire et à ajouter. Le fichier est créé s'il n'existe pas.

Dans votre cas, 'w'c'est préférable.

OU vous pourriez avoir:

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

11
très bonne réponse. Ruby conevntion est un cas de serpent pour les noms de var. Juste un avertissement pour les débutants. outFiledevrait ressembler à out_file.
Adam Waite

3
@AdamWaite J'ai édité la réponse selon votre suggestion snake_case, laissant ce commentaire pour le contexte.
Kris

3
@zanbri - que se passe-t-il si je ne ferme pas le fichier?
Erran Morad du

1
excellente réponse, complète et brève
Boris

2
@BoratSagdiyev "Un objet File qui n'est plus référencé devient éligible pour le garbage collection. Le fichier sera fermé automatiquement lorsque l'objet File sera garbage collection." rootr.net/rubyfaq-9.html
jkdev

35

Essayer

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

sans utiliser le

File.new "out.txt"

25

Essayez d'utiliser "w+"comme mode d'écriture au lieu de simplement "w":

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

4
Cela dépend si vous voulez écrire uniquement ( w) ou à la fois en lecture et en écriture ( w+).
jkdev

20

OK, maintenant je me sens stupide. Les deux premiers ne fonctionnent certainement pas mais les deux seconds le font. Je ne sais pas comment je me suis convaincu que je les avais essayés. Désolé de perdre le temps de tout le monde.

Si cela aide quelqu'un d'autre, cela peut se produire lorsque vous essayez de créer un nouveau fichier dans un répertoire qui n'existe pas.


11

Le répertoire n'existe pas. Assurez-vous qu'il existe openet ne créera pas ces répertoires pour vous.

J'ai rencontré cela moi-même il y a quelque temps.


11

File.newet File.openpar défaut en mode lecture ( 'r') comme mécanisme de sécurité, pour éviter d'écraser un fichier. Nous devons explicitement dire à Ruby d'utiliser le mode d'écriture ('w' c'est le moyen le plus courant) si nous allons sortir dans le fichier.

Si le texte à afficher est une chaîne, plutôt que d'écrire:

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

ou pire:

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

Utilisez le plus succinct write:

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

writea permis modes afin que nous puissions utiliser 'w', 'a','r+' le cas échéant.

open avec un bloc est utile si vous devez calculer la sortie dans une boucle itérative et que vous voulez laisser le fichier ouvert comme vous le faites. writeest utile si vous allez sortir le contenu en une seule fois, puis fermer le fichier.

Consultez la documentation pour plus d'informations.


Bonne réponse, c'est la manière la plus idiomatique et donc la "rubisiste". Devrait être la meilleure réponse.
Gino

Eh bien, je suis d'accord. J'utilise rarement la forme de bloc pour écrire des fichiers. C'est trop bruyant visuellement.
the Tin Man

11

Si l'objectif est simplement de créer un fichier, la manière la plus directe que je vois est:

 FileUtils.touch "foobar.txt"

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

Vous pouvez utiliser File.write('name of file here', data)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.