nodejs - 如何更改文件的创建时间

Posted

技术标签:

【中文标题】nodejs - 如何更改文件的创建时间【英文标题】:nodejs - how to change creation time of file 【发布时间】:2014-10-18 12:01:40 【问题描述】:

fsStat 类实例返回 mtime、atime 和 ctime 日期对象,但似乎只有用于更改 mtime 和 atime 的 API(我猜是最后修改和访问)。如何更改创建时间以创建文件的精确副本,因为它也会与原始文件同时创建?

【问题讨论】:

【参考方案1】:

目前无法使用 Node 本身,但您可以使用 https://github.com/baileyherbert/utimes(Node 的本机插件)来更改 Windows 和 Mac 上文件的创建时间(又名 btime)。

【讨论】:

它是 Linux 文件服务器,但它可以工作,而且它实际上比我以前使用的更好 bc 允许 undefined 保持字段不变。 在 Linux 上,设置 btime 是无操作的,但如果提供了 mtimeatime,则会在 Linux 上设置。 嗯?为什么?我有 btrfs RAID 阵列,我想备份并能够恢复低级文件元数据。这包括btime。 btrfs 文件系统上的节点统计返回 atimemtimectimebirthtime(尽管 birthtimectime 是相同的)。我想改变它们。是的,我知道在 UNIX 中 ctime 实际上不是文件创建时间,而是最后一次 inode 更新,但无论如何。只要我不使用硬链接,它就是创建时间 据我了解Linux不支持birthtime的概念。据我所知,没有用于获取或设置birthtime 的 Linux API。 Linux 文件系统通常甚至没有一个字段来存储文件的birthtime(即使 Linux 有 API 来更改它)。 Node 在 Linux 上的 fs.stats 实例上引入了一个虚拟的 birthtime,它跟踪 ctime(这是没有意义的)。 Windows和Mac是支持birthtime的系统。 好吧 ext4 和 btrfs 确实支持它,但它并不完全是文件的诞生时间,因为就像我说的那样,它是最后一次 inode 更改的日期,所以它会在创建文件的硬链接时发生变化。但是,只要没有 inode 更改,它将保持文件创建日期。我检查了它的节点支持,是的,fs.statSync 返回的 ctime 是正确的,并且在创建硬链接后它确实发生了变化。【参考方案2】:

tl;tr: 这是不可能的 atm (Node.js

尽管如此,fs.stat() 返回文件的birthtime

birthtime "Birth Time" - 文件创建时间。创建文件时设置一次。在没有出生时间的文件系统上,该字段可能会保存ctime1970-01-01T00:00Z(即,unix 纪元时间戳0)...

在 Node v0.12 之前,ctime 在 Windows 系统上持有 birthtime 请注意,从 v0.12 开始,ctime 不是“创建时间”,并且在Unix 系统,从来没有。

无法更新。来自https://github.com/joyent/node/issues/8252:

fs.utimes 使用 utime(2) (http://linux.die.net/man/2/utime),它不允许您更改 ctime。

(同样适用于birthtime

【讨论】:

ctime 不是创建时间 @PA。感谢您的提及,我已经澄清了我的答案——至少在 Windows 上,ctime 在撰写本文时已被用作创建时间。【参考方案3】:

fs.utimesfs.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

【讨论】:

至少到node v10.0,fs.utimes只更新atimemtime,而不是OP想要的字段birthtime

以上是关于nodejs - 如何更改文件的创建时间的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs / PostgreSQL sequelize - 如何更新/更改数据库中的模型?

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

如何在 Ubuntu 上检查和更改 Nodejs 版本?

如何在 Nodejs 调试控制台视图中更改对象的字符串表示

如何使用 nodeJS 和 discordJS 更改 Discord 频道名称?

使用代理时如何停止NodeJS“请求”模块更改请求