重命名和重新创建文件时出现奇怪的时间戳重复

Posted

技术标签:

【中文标题】重命名和重新创建文件时出现奇怪的时间戳重复【英文标题】:Strange timestamp duplication when renaming and recreating a file 【发布时间】:2015-04-01 20:36:15 【问题描述】:

我正在尝试将名为 appname.log 的日志文件重命名为 appname_DDMMYY.log 格式以进行归档,并重新创建一个空的 appname.log 以供进一步写入。在 Windows 7 中使用 C++ 和 WinAPI 或 Qt 调用(内部可能相同)执行此操作时,新创建的 .log 文件奇怪地继承了重命名文件的时间戳(最后修改、创建)。 在 Windows 资源管理器中重命名文件并随后在同一目录中快速创建具有相同名称的文件时,也可以观察到此行为。但必须快速完成。单击“新文本文件”后,时间戳是正常的,但重命名后它们会更改为重命名文件具有或仍然具有的时间戳。

这是某种错误吗?如何在不弄乱时间戳的情况下重命名文件并在不久后重新创建它?

【问题讨论】:

我看到了同样的问题。在我的例子中,代码是用 python 编写的。仅在 Windows 上发生。相同的代码,但在 Mac 上运行没有这个问题。 Unbelievable strange file creation time problem的可能重复 【参考方案1】:

这看起来像是设计使然,也许是为了节省“原子节省”的时间。如果应用程序执行类似(保存到临时文件、删除原始文件、将临时文件重命名为原始文件)来消除文件损坏的风险,那么每次保存文件时,创建时间都会增加。您多年来一直在编辑的文件今天似乎已创建。这种保存模式很常见。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx 如果您重命名或删除文件,然后在不久后恢复它,Windows 会在缓存中搜索要恢复的文件信息。缓存信息包括其短/长名称对和创建时间。 请注意,修改时间不会恢复。所以保存后文件好像被修改了,创建时间和之前一样。

如果您创建“a-new”并将其重命名为“a”,您将获得“a”的旧创建时间。如果删除“a”并重新创建“a”,则会得到“a”的旧创建时间。

【讨论】:

有趣的是指出保存模式,也许这比第一句中的“原子保存”更强调。【参考方案2】:

这种行为称为“文件隧道”。文件隧道允许“......与依赖文件系统的程序兼容,能够在短时间内保留文件元信息”。基本上向后兼容使用“安全保存”功能的旧 Windows 系统,该功能涉及将新文件的副本保存到临时文件,删除原始文件,然后将临时文件重命名为原始文件。

请参阅以下知识库文章:https://support.microsoft.com/en-us/kb/172190 (archive)

作为测试示例,创建FileA,将FileA重命名为FileB,再次创建FileA(15秒内),创建日期与FileB相同。

可以根据上面的知识库文章在注册表中禁用此行为。在“取证”Windows 机器时,这种行为也很烦人。

问候

亚当·B

【讨论】:

【参考方案3】:

这是一个简单的 python 脚本,它重现了我的 Windows7 64 位系统上的问题:

import time
import os

def touch(path):
    with open(path, 'ab'):
        os.utime(path, None)

touch('a')
print "    'a' timestamp: ", os.stat('a').st_ctime
os.rename('a', 'a-old')
time.sleep(15)
touch('a')
print "new 'a' timestamp: ", os.stat('a').st_ctime

os.unlink('a')
os.unlink('a-old')

睡眠时间约为 15 秒,我将得到以下输出:

    'a' timestamp:  1436901394.9
new 'a' timestamp:  1436901409.9

但是在睡眠时间

    'a' timestamp:  1436901247.32
new 'a' timestamp:  1436901247.32

两个文件...相隔 10 秒创建的都有时间创建时间戳!

【讨论】:

以上是关于重命名和重新创建文件时出现奇怪的时间戳重复的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 或命令行上传到 BigQuery 时出现奇怪的重复字段错误。所有字段唯一

python重命名多个文件

移动文件并使用时间戳日期重命名的脚本

使用 PDF 内容创建存档/.pkg 以在 Apple 托管时出现可执行文件的奇怪错误

创建、重命名或删除文件夹时 ASP.NET 重新启动

在Access 2010中运行追加查询时出现“表已存在”错误