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?

Civatrix
la source
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
zanbri
la source
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"
GMD
la source
25

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

File.open("out.txt", "w+") { |file| file.write("boo!") }
Chris Bunch
la source
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.

à M
la source
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.

nterry
la source
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.

l'homme d'étain
la source
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"
Nicola Mingotti
la source
1
data = 'data you want inside the file'.

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

Ispirett
la source
0

Vous pouvez également utiliser des constantes au lieu de chaînes pour spécifier le mode souhaité. L'avantage est que si vous faites une faute de frappe dans un nom constant, votre programme lèvera une exception d'exécution.

Les constantes sont File::RDONLYou File::WRONLYou File::CREAT. Vous pouvez également les combiner si vous le souhaitez.

Description complète des modes d'ouverture de fichier sur ruby-doc.org

Alex Tamoykin
la source