Створення порожнього файлу в 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.