Створення порожнього файлу в Ruby: "touch" еквівалент?


119

Який найкращий спосіб створити порожній файл у Ruby?

Щось схоже на команду Unix, торкніться :

touch file.txt

5
Ви завжди можете це зробити`touch file.txt`
Марк Томас

8
@Mark: навіть на windows?
Марк-Андре Лафортун

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 автоматично закриється, коли блок припиняється.


Дякую, я надсилаю новий файл в інший процес, тому ручку потрібно негайно закрити.
Абхі Беккерт

12
Варто зазначити, що це насправді не дзеркально touch- воно перезапише файл, якщо він існує.
MrTheWalrus

3
Використовуйте режим додавання, і файл не буде усічений, якщо він вже існує File.open ("foo.txt", "a") {} Це також не відображає дзеркальне відображення "touch", але тоді "touch (1)" не було питання.
Г. Аллен Морріс III

Використання "a" не оновлює mtime. ("touch" був підзаголовком, тому Google приносить нам людей, які хочуть доторкнутися до Ruby.)
Martin Dorey

у * nix системах, хто власник файлу, коли він створений таким чином?
Іслам Азаб

24

У Ruby 1.9.3+ ви можете використовувати File.write(aka 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
Чи залишає це відкрите ручку файлу позаду, як це було б в інших мовах?
Абхі Беккерт

4
@Abhi: Так, але збирання сміття в будь-який момент впорається з цим. Щоб уникнути цього, пройдіть порожній блок (див. Відповідь Майкла Коля)
Марк-Андре Лафортун

Коли "в якийсь момент" станеться? В кінці сценарію, або відразу тому, що він не був призначений жодній змінній? Я створюю файл, щоб інші процеси в системі могли почати працювати з ним негайно, і вони будуть заблоковані, якщо ручка файлу все ще відкрита для запису.
Абхі Беккерт

1
File.open ("foo.txt", "w"). Close () вирішує проблему файлових файлів, але FileUtils.touch є кращим рішенням.
Майкл Кемпбелл

Не залишайте так, щоб відкриті файли
мали
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.