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
是无操作的,但如果提供了 mtime
和 atime
,则会在 Linux 上设置。
嗯?为什么?我有 btrfs RAID 阵列,我想备份并能够恢复低级文件元数据。这包括btime。 btrfs 文件系统上的节点统计返回 atime
、mtime
、ctime
和 birthtime
(尽管 birthtime
和 ctime
是相同的)。我想改变它们。是的,我知道在 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" - 文件创建时间。创建文件时设置一次。在没有出生时间的文件系统上,该字段可能会保存ctime
或1970-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.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
【讨论】:
至少到node v10.0,fs.utimes
只更新atime
和mtime
,而不是OP想要的字段birthtime
。以上是关于nodejs - 如何更改文件的创建时间的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs / PostgreSQL sequelize - 如何更新/更改数据库中的模型?
如何在使用 Sequelize 更改列或添加新列时更新迁移文件