Créer un fichier vide dans Ruby: équivalent «tactile»?

119

Quelle est la meilleure façon de créer un fichier vide dans Ruby?

Quelque chose de similaire à la commande Unix, touchez :

touch file.txt
Abhi Beckert
la source
5
Vous pouvez toujours faire`touch file.txt`
Mark Thomas
8
@Mark: même sous Windows?
Marc-André Lafortune
1
Des gens qui se soucient d'une programmation appropriée indépendante de la plate-forme? :-)
TJ Biddle

Réponses:

181

FileUtils.touchressemble à ce qu'il fait et reflète * la touchcommande:

require 'fileutils'
FileUtils.touch('file.txt')

* Contrairement à touch (1), vous ne pouvez pas mettre à jour mtime ou atime seul. Il manque également quelques autres options intéressantes.

Dave Newton
la source
@ 5chdn Vous voulez dire sans les parents? Oui, les parenthèses autour des paramètres de méthode sont (parfois) facultatives.
Dave Newton
44

Si vous vous inquiétez des descripteurs de fichiers:

File.open("foo.txt", "w") {}

À partir de la documentation :

Si le bloc de code optionnel est donné, le fichier ouvert lui sera transmis comme argument, et l'objet File sera automatiquement fermé lorsque le bloc se terminera.

Michael Kohl
la source
Merci, j'envoie le nouveau fichier à un autre processus, donc le handle doit être fermé immédiatement.
Abhi Beckert
12
Il convient de souligner que cela ne reflète pas réellement touch- il écrasera le fichier s'il existe.
MrTheWalrus
3
Utilisez le mode ajout et le fichier ne sera pas tronqué s'il existe déjà File.open ("foo.txt", "a") {} Cela ne reflète pas non plus 'touch', mais alors 'touch (1)' ne l'était pas la question.
G.Allen Morris III
L'utilisation de "a" ne met pas à jour le mtime. ("touch" était le sous-titre, donc Google nous amène des gens qui veulent une touche Ruby.)
Martin Dorey
sur les systèmes * nix, qui est le propriétaire du fichier lorsqu'il est créé de cette façon?
Islam Azab
24

Dans Ruby 1.9.3+, vous pouvez utiliser File.write(aka IO.write):

File.write("foo.txt", "")

Pour la version antérieure, soit require "backports/1.9.3/file/write"ou utilisezFile.open("foo.txt", "w") {}

Marc-André Lafortune
la source
C'est beaucoup plus propre, mais malheureusement, je dois être rétrocompatible. Je garderai cela à l'esprit pour une utilisation future.
Abhi Beckert
2

Et aussi, moins avantageux, mais très bref:

`touch file.txt`
Boris Stitnicky
la source
3
Will fourchettes prix séparés, donc est très lent.
denis.peplin
Et est déjà mentionné dans les commentaires, ce que je n'ai pas remarqué plus tôt.
Boris Stitnicky
-1

Juste un exemple:

File.open "foo.txt", "w"
WarHog
la source
1
Cela laisse-t-il un descripteur de fichier ouvert, comme il le ferait dans d'autres langues?
Abhi Beckert
4
@Abhi: Oui, mais le garbage collection le gérera à un moment donné. Pour éviter cela, passez un bloc vide (voir la réponse de Michael Kohl)
Marc-André Lafortune
Quand "à un moment donné" va-t-il se produire? À la fin du script, ou immédiatement parce qu'il n'a été affecté à aucune variable? Je crée le fichier pour que les autres processus du système puissent commencer à travailler avec lui immédiatement, et ils seront bloqués si le descripteur de fichier est toujours ouvert pour l'écriture.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () résout le problème du gestionnaire de fichiers, mais FileUtils.touch est une meilleure solution.
Michael Campbell
Ne laissez pas les poignées de fichiers ouvertes comme ça :-)
sekmo