Как установить время создания файла с помощью ruby ​​в Mac OS? - PullRequest
9 голосов
/ 08 декабря 2011

Я пытаюсь установить время создания файловой системы для файла в Mac OS, используя скрипт ruby.

В Mac OS X 'ctime' представляет собой последний раз модификации inode, а не создания файлавремя, таким образом, использование File.utime () в ruby ​​для установки ctime не поможет.

Используя эту подсказку [http://inessential.com/2008/12/18/file_creation_date_in_ruby_on_macs], я могу получить время создания файла:

Time.parse(`mdls -name kMDItemContentCreationDate -raw "#{filename}"`)

... но есть идеи, как установить его с помощью ruby?

- ОБНОВЛЕНИЕ -

Хорошо, я думаю, что может на самом деле сделать это с File.utime in ruby.

Несмотря на то, что ctime технически не используется Mac OS для отслеживания времени создания файла, при использовании utime для обновления ctime (вместе с mtime , который должен быть установлен одновременно) файловая система волшебным образом обновляет также время создания согласно kMDItemContentCreationDate.

Таким образом, чтобы установить filename на ctime 1 октября 2010 г.и время 2 октября 2010 года:

File.utime(Time.strptime('011010', '%d%m%y'), Time.strptime('021010', '%d%m%y'), filename)

Ответы [ 4 ]

12 голосов
/ 28 августа 2012

Существует решение Ruby с методом utime. Но вам придется установить время изменения (mtime) и время доступа (atime) одновременно . Если вы хотите сохранить время доступа, вы можете использовать:

File.utime(File.atime(path), modification_time, path)

См. Также документацию по ядру Ruby .

3 голосов
/ 24 декабря 2011

Итак, у вас определенно работает чистое решение Ruby, но, поскольку это OS X, вы против exec() или system() и просто используете touch?В вашем случае я бы предпочел:

system "touch -t YYYYMMDDhhmm /what/ever"

, если бы не по какой-либо другой причине, кроме ясности.

2 голосов
/ 08 февраля 2016

Это работает для меня, чтобы обновить время создания на OS X 10.11.1:

system "SetFile -d '#{time.strftime "%m/%d/%Y %H:%M:%S"}' #{file}"

Никаких претензий на переносимость - SetFile - это команда OS X (а на странице руководства написано, что она устарела в XCode 6, поэтому может работать не очень долго) - не смог найти другой способ сделать это, Time.utime didn не обновлять время создания, а только измененное и доступное время.

См .: https://apple.stackexchange.com/q/99536/65787

0 голосов
/ 02 октября 2017

Ruby использует системный вызов utimes для изменения времени файла.

Чтение man-страницы для utimes объясняет, что происходит:

int utimes (const char * path, const struct timeval* раз);Если время не равно NULL, предполагается, что оно указывает на массив из двух временных структур.Время доступа устанавливается равным значению первого элемента, а время модификации устанавливается равным значению второго элемента.Для файловых систем, которые поддерживают время рождения (создания) файла (например, UFS2), время рождения будет установлено равным значению второго элемента, если второй элемент старше, чем текущее установленное время рождения.Чтобы установить время рождения и время модификации, требуется два вызова;первый - для установки времени рождения, а второй - для (предположительно более нового) времени модификации....

Так что ctime обновляется только в обратном направлении.

...