Erstellen einer leeren Datei in Ruby: "Touch" -Äquivalent?

119

Was ist der beste Weg, um eine leere Datei in Ruby zu erstellen ?

Ähnlich wie beim Unix-Befehl berühren Sie :

touch file.txt
Abhi Beckert
quelle
5
Sie können immer tun`touch file.txt`
Mark Thomas
8
@ Mark: auch unter Windows?
Marc-André Lafortune
1
Menschen, die sich für eine richtige plattformunabhängige Programmierung interessieren? :-)
TJ Biddle

Antworten:

180

FileUtils.touchsieht aus wie es tut und spiegelt * den touchBefehl:

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

* Im Gegensatz zu touch (1) können Sie mtime oder atime nicht alleine aktualisieren. Es fehlen auch ein paar andere nette Optionen.

Dave Newton
quelle
@ 5chdn Du meinst ohne die Parens? Ja, Parens um Methodenparameter sind (manchmal) optional.
Dave Newton
44

Wenn Sie sich Sorgen um Dateihandles machen:

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

Aus den Dokumenten :

Wenn der optionale Codeblock angegeben ist, wird ihm die geöffnete Datei als Argument übergeben, und das File-Objekt wird automatisch geschlossen, wenn der Block beendet wird.

Michael Kohl
quelle
Vielen Dank, ich sende die neue Datei an einen anderen Prozess, daher muss das Handle sofort geschlossen werden.
Abhi Beckert
12
Es ist erwähnenswert, dass dies nicht wirklich spiegelt touch- es wird die Datei überschreiben, wenn es existiert.
MrTheWalrus
3
Verwenden Sie den Append-Modus und die Datei wird nicht abgeschnitten, wenn sie bereits vorhanden ist. File.open ("foo.txt", "a") {} Dies spiegelt auch nicht 'touch' wider, aber 'touch (1)' war es nicht die Frage.
G. Allen Morris III
Die Verwendung von "a" aktualisiert die mtime nicht. ("touch" war der Untertitel, also bringt Google uns Leute, die einen Ruby-Touch wollen.)
Martin Dorey
Wer ist auf * nix-Systemen der Dateibesitzer, wenn er auf diese Weise erstellt wird?
Islam Azab
24

In Ruby 1.9.3+ können Sie File.write(aka IO.write) verwenden:

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

Für frühere Version entweder require "backports/1.9.3/file/write"oder verwendenFile.open("foo.txt", "w") {}

Marc-André Lafortune
quelle
Das ist viel sauberer, aber leider muss ich abwärtskompatibel sein. Ich werde es jedoch für die zukünftige Verwendung berücksichtigen.
Abhi Beckert
2

Und auch weniger vorteilhaft, aber sehr kurz:

`touch file.txt`
Boris Stitnicky
quelle
3
Wird den Preis trennen, ist also sehr langsam.
denis.peplin
Und wird bereits in den Kommentaren erwähnt, die ich vorher nicht bemerkt habe.
Boris Stitnicky
-1

Nur ein Beispiel:

File.open "foo.txt", "w"
WarHog
quelle
1
Lässt dies ein offenes Dateihandle zurück, wie es in einigen anderen Sprachen der Fall wäre?
Abhi Beckert
4
@Abhi: Das tut es, aber die Garbage Collection wird es irgendwann schaffen. Um dies zu vermeiden, passieren Sie einen leeren Block (siehe Michael Kohls Antwort)
Marc-André Lafortune
Wann wird "irgendwann" passieren? Am Ende des Skripts oder sofort, weil es keiner Variablen zugewiesen wurde? Ich erstelle die Datei, damit andere Prozesse auf dem System sofort damit arbeiten können. Sie werden blockiert, wenn das Dateihandle noch zum Schreiben geöffnet ist.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () löst das Problem mit dem Dateihandle, aber FileUtils.touch ist eine bessere Lösung.
Michael Campbell
Lassen Sie keine offenen
Dateihandles