nodejs - как изменить время создания файла

Экземпляр класса fsStat возвращает объекты даты mtime, atime и ctime, но, похоже, есть API только для изменения mtime и atime (последняя модификация и доступ, я думаю). Как я могу изменить время создания, чтобы создать точную копию файла, поскольку она также будет создана в то же время, что и оригинал?


person Lapsio    schedule 25.08.2014    source источник


Ответы (4)


В настоящее время это невозможно с самим Node, но вы можете использовать https://github.com/baileyherbert/utimes (собственное дополнение для Node), чтобы изменить время создания (также известное как btime) файла в Windows и Mac.

person Joran Greef    schedule 29.05.2017
comment
Это файловый сервер Linux, но он работает, и на самом деле лучше, чем то, что я использовал, потому что позволяет undefined сохранять поле без изменений. - person Lapsio; 29.05.2017
comment
В Linux установка btime невозможна, но mtime и atime будут установлены в Linux, если они предоставлены. - person Joran Greef; 30.05.2017
comment
Хм? Почему? У меня есть RAID-массив btrfs, и я хочу сделать резервную копию и иметь возможность восстанавливать метаданные файла низкого уровня. Это включает в себя btime. node stat в файловой системе btrfs возвращает atime, mtime, ctime и birthtime (хотя birthtime и ctime одинаковы). Я хочу изменить их. И да, я знаю, что в UNIX ctime - это не время создания файла, а последнее обновление индекса, но неважно. Пока я не буду использовать жесткие ссылки, это время создания - person Lapsio; 31.05.2017
comment
О... кажется, Linux на самом деле явно запрещает такую ​​операцию, и для этого требуется изменить системные часы на старую дату, затем создать жесткую ссылку на файл и удалить его, а затем установить системные часы обратно на правильную дату... Это... довольно неудобно.. . - person Lapsio; 31.05.2017
comment
Насколько я понимаю, Linux не поддерживает концепцию birthtime. Насколько я знаю, нет API Linux для получения или установки birthtime. Файловые системы Linux обычно даже не имеют поля для хранения birthtime файла (даже если у Linux есть API для его изменения). Node представляет фиктивный birthtime на fs.stats экземплярах в Linux, который отслеживает ctime (что бессмысленно). Windows и Mac — это системы, поддерживающие birthtime. - person Joran Greef; 01.06.2017
comment
хорошо, ext4 и btrfs поддерживают это, но это не совсем время рождения файла, потому что, как я уже сказал, это дата последнего изменения индекса, поэтому она меняется, например, когда создается жесткая ссылка на файл. Однако до тех пор, пока не будет изменен индексный дескриптор, дата создания файла останется. И я проверил поддержку узла для него, и да, ctime, возвращаемый fs.statSync, правильный, и он действительно меняется после создания жесткой ссылки. - person Lapsio; 01.06.2017
comment
@ronomon/utimes больше не поддерживается и не работает на Catalina и последней версии Node.js. Проверьте вместо этого utimes -› github.com/ Бейлихерберт/utimes - person Mariusz Nowak; 30.07.2020

tl;tr: это невозможно в atm (Node.js ‹= v6).

Несмотря на это, fs.stat() возвращает дата рождения файлов:

birthtime Birth Time - Время создания файла. Устанавливается один раз при создании файла. В файловых системах, где время рождения недоступно, это поле может вместо этого содержать либо ctime, либо 1970-01-01T00:00Z (т. е. отметку времени эпохи unix 0)…

До Node v0.12 ctime занимало birthtime в системах Windows. Обратите внимание, что начиная с версии 0.12 ctime не является временем создания, а в системах Unix его никогда не было.

Обновление невозможно. Из https://github.com/joyent/node/issues/8252:

fs.utimes использует utime(2) (http://linux.die.net/man/2/utime), что не позволяет вам изменить ctime .

(То же самое относится и к birthtime)

person schnittstabil    schedule 15.01.2015
comment
ctime не время создания - person PA.; 21.10.2016
comment
@ПА. спасибо за упоминание, я уточнил свой ответ - по крайней мере, в Windows ctime использовалось как время создания на момент написания. - person schnittstabil; 25.10.2016

Методы fs.utimes и fs.utimesSync встроены в ядро ​​Node.js. См. https://nodejs.org/api/fs.html#fs_fs_utimes_path_atime_mtime_callback.

Примечание:

Значение должно быть отметкой времени Unix в секундах. Например, Date.now() возвращает миллисекунды, поэтому перед передачей его следует разделить на 1000.

Чтобы преобразовать объект даты JS в секунды:

new Date().getTime()/1000|0
person Zeke    schedule 11.08.2017
comment
По крайней мере, до node v10.0 fs.utimes обновляет только atime и mtime, а не поле, которое хотел OP, то есть birthtime. - person mrm; 03.05.2018

Если вы хотите только решить проблему (изменить время создания файла), в python есть решение. См. здесь: https://stackoverflow.com/a/4996407/6733679.

person percy507    schedule 08.06.2017