Jeśli podano opcjonalny blok kodu, zostanie przekazany otwarty plik jako argument, a obiekt File zostanie automatycznie zamknięty po zakończeniu bloku.
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):
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 :-)
`touch file.txt`
Odpowiedzi:
FileUtils.touch
Wygląda na to, co robi, i lusterka * ztouch
polecenia:* W przeciwieństwie do touch (1) , nie możesz aktualizować samego czasu ani atime. Brakuje też kilku innych fajnych opcji.
źródło
Jeśli martwisz się o uchwyty plików:
Z dokumentów :
źródło
touch
- nadpisze plik, jeśli istnieje.W Rubim 1.9.3+ możesz użyć
File.write
(akaIO.write
):W przypadku wcześniejszej wersji
require "backports/1.9.3/file/write"
użyj lub użyjFile.open("foo.txt", "w") {}
źródło
A także mniej korzystne, ale bardzo krótkie:
źródło
Tylko przykład:
źródło