Создание пустого файла в 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


-1

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

File.open "foo.txt", "w"

1
Остается ли при этом дескриптор открытого файла, как в некоторых других языках?
Abhi Beckert

4
@Abhi: Да, но сборщик мусора в какой-то момент справится с этим. Однако, чтобы этого избежать, передайте пустой блок (см. Ответ Майкла Коля)
Марк-Андре Лафортюн

Когда "в какой-то момент" произойдет? В конце скрипта или сразу, потому что он не был назначен какой-либо переменной? Я создаю файл, чтобы другие процессы в системе могли начать работать с ним немедленно, и они будут заблокированы, если дескриптор файла все еще открыт для записи.
Abhi Beckert

1
File.open ("foo.txt", "w"). Close () решает проблему с дескриптором файла, но FileUtils.touch - лучшее решение.
Майкл Кэмпбелл,

Не оставляйте такие дескрипторы открытых файлов :-)
sekmo 07
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.