Tworzenie pustego pliku w Rubim: odpowiednik „dotykowego”?

119

Jaki jest najlepszy sposób na utworzenie pustego pliku w Rubim?

Coś podobnego do polecenia Unix, dotknij :

touch file.txt
Abhi Beckert
źródło
5
Zawsze możesz to zrobić`touch file.txt`
Mark Thomas
8
@Mark: nawet w systemie Windows?
Marc-André Lafortune
1
Osoby, którym zależy na poprawnym programowaniu niezależnym od platformy? :-)
TJ Biddle

Odpowiedzi:

181

FileUtils.touchWygląda na to, co robi, i lusterka * z touchpolecenia:

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

* W przeciwieństwie do touch (1) , nie możesz aktualizować samego czasu ani atime. Brakuje też kilku innych fajnych opcji.

Dave Newton
źródło
@ 5chdn Masz na myśli bez parens? Tak, parens wokół parametrów metody są (czasami) opcjonalne.
Dave Newton,
44

Jeśli martwisz się o uchwyty plików:

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

Z dokumentów :

Jeśli podano opcjonalny blok kodu, zostanie przekazany otwarty plik jako argument, a obiekt File zostanie automatycznie zamknięty po zakończeniu bloku.

Michael Kohl
źródło
Dzięki, wysyłam nowy plik do innego procesu, więc uchwyt musi zostać natychmiast zamknięty.
Abhi Beckert,
12
Warto zwrócić uwagę, że w rzeczywistości nie jest to kopia lustrzana touch- nadpisze plik, jeśli istnieje.
MrTheWalrus
3
Użyj trybu dopisywania, a plik nie zostanie obcięty, jeśli już istnieje File.open ("foo.txt", "a") {} To również nie odzwierciedla 'dotknięcia', ale wtedy 'touch (1)' nie został pytanie.
G. Allen Morris III,
Użycie „a” nie aktualizuje czasu mtime. („dotyk” był podtytułem, więc Google dostarcza nam ludzi, którzy chcą dotknąć Ruby.)
Martin Dorey
w systemach * nix, kto jest właścicielem pliku, gdy jest on tworzony w ten sposób?
Islam Azab,
24

W Rubim 1.9.3+ możesz użyć File.write(aka IO.write):

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

W przypadku wcześniejszej wersji require "backports/1.9.3/file/write"użyj lub użyjFile.open("foo.txt", "w") {}

Marc-André Lafortune
źródło
To znacznie czystsze, ale niestety muszę być kompatybilny wstecz. Będę o tym pamiętać do wykorzystania w przyszłości.
Abhi Beckert
2

A także mniej korzystne, ale bardzo krótkie:

`touch file.txt`
Boris Stitnicky
źródło
3
Rozwidli cenę, więc jest bardzo powolny.
denis.peplin
I jest już wspomniany w komentarzach, których wcześniej nie zauważyłem.
Boris Stitnicky,
-1

Tylko przykład:

File.open "foo.txt", "w"
WarHog
źródło
1
Czy powoduje to pozostawienie otwartego uchwytu pliku, tak jak w niektórych innych językach?
Abhi Beckert
4
@Abhi: Tak, ale czyszczenie pamięci w pewnym momencie sobie z tym poradzi. Aby jednak tego uniknąć, przejdź przez pusty blok (patrz odpowiedź Michaela Kohla)
Marc-André Lafortune,
Kiedy „w którymś momencie” się wydarzy? Na końcu skryptu, czy od razu, ponieważ nie został on przypisany do żadnej zmiennej? Tworzę plik, aby inne procesy w systemie mogły rozpocząć z nim pracę natychmiast i zostaną zablokowane, jeśli uchwyt pliku jest nadal otwarty do zapisu.
Abhi Beckert,
1
File.open ("foo.txt", "w"). Close () rozwiązuje problem z uchwytem pliku, ale FileUtils.touch jest lepszym rozwiązaniem.
Michael Campbell
Nie zostawiaj otwartych uchwytów plików w ten sposób :-)
sekmo