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

Wop*_*pfi 5 timestamp file creation last-modified windows-7

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

这是某种错误吗?如何重新命名文件并在不久后重新创建文件,而不会弄乱时间戳?

Dav*_*yer 5

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

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx 如果您重命名或删除文件,然后不久将其还原,Windows 会在缓存中搜索文件要恢复的信息。缓存的信息包括其短/长名称对和创建时间。 请注意,修改时间不会恢复。因此,保存后,文件似乎已被修改,并且创建时间与之前相同。

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


Pot*_*bic 1

这是一个简单的 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')
Run Code Online (Sandbox Code Playgroud)

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

    'a' timestamp:  1436901394.9
new 'a' timestamp:  1436901409.9
Run Code Online (Sandbox Code Playgroud)

但是当睡眠时间 <= ~10 秒时,人们会得到这样的结果:

    'a' timestamp:  1436901247.32
new 'a' timestamp:  1436901247.32
Run Code Online (Sandbox Code Playgroud)

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