我需要更新创建时间删除并重新创建虚假文件,将其时间设置为“现在”。奇怪的是,新创建的文件看起来继承了原始文件的创建时间!
让我演示一下:
> touch a.txt //create a new file
> dir /T:C //creation time
02/27/2013 02:04 PM 0 a.txt
> dir /T:W //modification time
02/27/2013 02:04 PM 0 a.txt
//wait a bit...
> touch a.txt //update modified-time
> dir /T:C
02/27/2013 02:04 PM 0 a.txt
> dir /T:W //mod-time changed, as expected
02/27/2013 02:05 PM 0 a.txt
> del a.txt
> touch a.txt //recreate file
> dir /T:C //same original ctime !!
02/27/2013 02:04 PM 0 a.txt
> dir /T:W //the actual time the 2nd file was created
02/27/2013 02:06 PM 0 a.txt
> del a.txt
> touch b.txt //ok, create a file with a different name
> dir /T:C //ctime as expected
02/27/2013 02:07 PM 0 b.txt
> mv b.txt a.txt
> dir /T:C //again, ctime of original file!
02/27/2013 02:04 PM 0 a.txt
> del a.txt
> touch c.txt //create a file with a different name, again
> dir /T:C //ctime as expected
02/27/2013 02:08 PM 0 c.txt
> cp c.txt a.txt //this time copy it...
> dir /T:C //ctime of a.txt is that of original file!
02/27/2013 02:04 PM 0 a.txt
02/27/2013 02:08 PM 0 c.txt
//wait longer...
> del *
> touch d.txt
> dir /T:C
02/27/2013 02:22 PM 0 d.txt
> cp d.txt a.txt
> dir /T:C //lo and behold, the ctime has changed.
02/27/2013 02:22 PM 0 a.txt
02/27/2013 02:22 PM 0 d.txt
我的演示到此结束。有两个问题需要解决:
^^^ 他说的话。
我该如何修复它?
好的,让我进一步阐述一下:
有人知道 Windows OS/NTFS 的内部机制是什么吗?看起来发生了一些文件元数据缓存,并且缓存失效是有时间限制的。
关于如何获得与原始文件同名的全新文件,并保持最新状态,
ctime
您有什么建议吗?欢迎提出任何建议,无论是批处理脚本、注册表黑客、编程还是其他什么。
答案1
答案:
- 该过程称为“文件系统隧道”(源自量子力学),据我所知,它最初是为 Win95 设计的。操作系统有必要处理程序仅保存并覆盖文件的情况。在这种情况下,用户通常希望创建日期(和短文件名)不会改变,但如果没有隧道,创建日期将反映上次保存时间。请参阅:关于 Windows 文件时间的一些提醒,文件系统隧道的秘密历史
- 有两种方法可以解决此问题:
- 保存/创建后立即修改创建时间
- 通过注册表设置(针对整个操作系统):
文件隧道设置由 Windows 注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 控制。
要增加隧道缓存时间,请修改/添加 DWORD 值 MaximumTunnelEntryAgeInSeconds。默认缓存时间为 15 秒。要禁用隧道,请修改/添加 DWORD 值 MaximumTunnelEntries 并将其设置为 0。
答案2
我不使用 Windows,但我认为我找到了一种解决方法。
如果你没有使用 Win32 编写应用程序,你应该能够使用 PowerShell。基于类似的 stackoverflow 答案:
C:\> powershell (ls your-file-name-here).CreationTime = Get-Date
答案3
使用 atime,而不是 ctime。访问时间实际上是创建时间,因为它不会在访问时更新不再