Создание пустого файла в Ruby: «сенсорный» эквивалент?

119

Как лучше всего создать пустой файл в Ruby?

Что-то похожее на команду Unix, коснитесь :

touch file.txt
Абхи Бекерт
источник
5
Вы всегда можете сделать`touch file.txt`
Марк Томас
8
@Mark: даже в окнах?
Marc-André Lafortune
1
Люди, которым важно правильное программирование, не зависящее от платформы? :-)
TJ Biddle

Ответы:

181

FileUtils.touchПохоже , что он делает, и зеркало * в touchкоманде:

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

* В отличие от touch (1) вы не можете обновлять mtime или atime в одиночку. Также отсутствует несколько других хороших опций.

Дэйв Ньютон
источник
@ 5chdn То есть без парен? Да, скобки вокруг параметров метода (иногда) необязательны.
Дэйв Ньютон,
44

Если вас беспокоят дескрипторы файлов:

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

Из документов :

Если задан необязательный блок кода, ему будет передан открытый файл в качестве аргумента, и объект 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):

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

Для более ранней версии либо require "backports/1.9.3/file/write"используйтеFile.open("foo.txt", "w") {}

Марк-Андре Лафортюн
источник
Это намного чище, но, к сожалению, мне нужна обратная совместимость. Я сохраню это для будущего использования.
Abhi Beckert
2

А также, менее выигрышно, но очень кратко:

`touch file.txt`
Борис Ститницкий
источник
3
Будет вилка отдельной цены, поэтому идет очень медленно.
denis.peplin
И это уже упоминалось в комментариях, которых я раньше не замечал.
Борис Ститницки
-1

Просто пример:

File.open "foo.txt", "w"
WarHog
источник
1
Остается ли при этом дескриптор открытого файла, как в некоторых других языках?
Abhi Beckert
4
@Abhi: Да, но сборщик мусора в какой-то момент справится с этим. Однако, чтобы этого избежать, передайте пустой блок (см. Ответ Майкла Коля)
Марк-Андре Лафортюн
Когда "в какой-то момент" произойдет? В конце скрипта или сразу, потому что он не был назначен какой-либо переменной? Я создаю файл, чтобы другие процессы в системе могли начать работать с ним немедленно, и они будут заблокированы, если дескриптор файла все еще открыт для записи.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () решает проблему с дескриптором файла, но FileUtils.touch - лучшее решение.
Майкл Кэмпбелл,
Не оставляйте такие дескрипторы открытых файлов :-)
sekmo 07