我正在尝试将名为appname.log的日志文件重命名为appname_DDMMYY.log形式以进行存档,并重新创建一个空的appname.log以进行进一步编写。在Windows 7中使用C ++和WinAPI或Qt调用(内部可能相同)执行此操作时,新创建的.log文件奇怪地从重命名的文件继承时间戳(上次修改,创建)。 在Windows资源管理器中重命名文件并在同一目录中快速创建具有相同名称的文件时,也可以观察到此行为。但它必须快速完成。单击“新文本文件”后,时间戳是正常的,但在重命名后,它们会更改为重命名的文件具有或仍然具有的时间戳。
这是某种Bug吗?我怎样才能重命名文件并在不事后重新创建它而不会让时间戳搞乱?
答案 0 :(得分:1)
这看起来像是设计的,也许是为了节省原子节省时间。"如果应用程序执行类似(保存为临时,删除原始文件,将temp重命名为原始文件)以消除受损文件的风险,则每次保存文件时创建时间都会增加。您已编辑多年的文件似乎已在今天创建。这种保存模式很常见。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx 如果您重命名或删除文件,此后不久还原,Windows会在缓存中搜索要还原的文件信息。缓存信息包括其短/长名称对和创建时间。 请注意,修改时间不会恢复。因此,保存后文件似乎已被修改,创建时间与以前相同。
如果您创建" a-new"并将其重命名为" a"你得到了" a"的旧创作时间。如果删除" a"并重新创造" a"你得到了" a"的旧创作时间。
答案 1 :(得分:1)
此行为称为"文件隧道"。文件隧道允许" ...以启用与依赖文件系统能够在短时间内保存文件元信息的程序的兼容性。对于使用"安全保存"的旧Windows系统,基本上是向后兼容。涉及将新文件的副本保存到临时文件,删除原始文件,然后将临时文件重命名为原始文件的功能。
请参阅以下知识库文章:https://support.microsoft.com/en-us/kb/172190
作为测试示例,创建FileA,将FileA重命名为FileB,再次创建FileA(在15秒内),创建日期将与FileB相同。
根据上面的知识库文章,可以在注册表中禁用此行为。当"取消"时,这种行为也很烦人。 Windows机器。
此致
Adam B
答案 2 :(得分:0)
这是一个简单的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
但是睡眠时间<= ~10秒,人们会得到这个:
'a' timestamp: 1436901247.32
new 'a' timestamp: 1436901247.32
相隔10秒创建的两个文件都有创建时间戳的时间!