Если задан необязательный блок кода, ему будет передан открытый файл в качестве аргумента, и объект File будет автоматически закрыт при завершении блока.
Спасибо, я отправляю новый файл другому процессу, поэтому нужно немедленно закрыть дескриптор.
Abhi Beckert
12
Стоит отметить, что на самом деле это не зеркало touch- он перезапишет файл, если он существует.
MrTheWalrus
3
Используйте режим добавления, и файл не будет обрезан, если он уже существует File.open ("foo.txt", "a") {} Это также не отражает 'touch', но тогда 'touch (1)' не был вопрос.
Г. Аллен Моррис III
Использование «a» не обновляет mtime. («прикосновение» было подзаголовком, поэтому Google приводит людей, которые хотят прикосновения Ruby.)
Мартин Дори,
на системах * nix, кто является владельцем файла, когда он создается таким образом?
Islam Azab
24
В Ruby 1.9.3+ вы можете использовать File.write(иначе IO.write):
Остается ли при этом дескриптор открытого файла, как в некоторых других языках?
Abhi Beckert
4
@Abhi: Да, но сборщик мусора в какой-то момент справится с этим. Однако, чтобы этого избежать, передайте пустой блок (см. Ответ Майкла Коля)
Марк-Андре Лафортюн
Когда "в какой-то момент" произойдет? В конце скрипта или сразу, потому что он не был назначен какой-либо переменной? Я создаю файл, чтобы другие процессы в системе могли начать работать с ним немедленно, и они будут заблокированы, если дескриптор файла все еще открыт для записи.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () решает проблему с дескриптором файла, но FileUtils.touch - лучшее решение.
Майкл Кэмпбелл,
Не оставляйте такие дескрипторы открытых файлов :-)
`touch file.txt`
Ответы:
FileUtils.touch
Похоже , что он делает, и зеркало * вtouch
команде:* В отличие от touch (1) вы не можете обновлять mtime или atime в одиночку. Также отсутствует несколько других хороших опций.
источник
Если вас беспокоят дескрипторы файлов:
Из документов :
источник
touch
- он перезапишет файл, если он существует.В Ruby 1.9.3+ вы можете использовать
File.write
(иначеIO.write
):Для более ранней версии либо
require "backports/1.9.3/file/write"
используйтеFile.open("foo.txt", "w") {}
источник
А также, менее выигрышно, но очень кратко:
источник
Просто пример:
источник