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