Windows文件系统:删除并再次创建文件时,文件的创建时间不会更改

时间:2012-01-10 13:53:12

标签: windows winapi filesystems

我有以下情况:

  • 1:创建一堆文件

  • 2:调用一些处理所有不同文件的外部应用程序 自上次快照以来的创建时间

  • 3:删除文件

  • 4:转到1

事实证明,当用户创建文件,删除文件并创建具有相同名称的文件时,Windows不保证会改变创建时间。

我写了一个小的PowerShell脚本来验证这个:

ls | Remove-Item

$fileListOld = @{}
foreach($i in 1..1000)
{
    $fname = [string]::Format("{0}.txt", $i)
    "tst" >> $fname    
}

ls | % { $fileListOld[$_.Name] = $_ }
ls | Remove-Item

foreach($i in 1..1000)
{
    $fname = [string]::Format("{0}.txt", $i)
    "tst" >> $fname    
}

$fileListNew = @{}
ls | % { $fileListNew[$_.Name] = $_ }

$count = 0



foreach ($fname in $fileListNew.Keys)
{
    if ($fileListNew[$fname].CreationTimeUtc -eq $fileListOld[$fname].CreationTimeUtc)
    {
        Write-Host Same creation time -ForegroundColor Red
        Write-Host $fname -ForegroundColor Red
        $count++
    }
}

Write-Host $count

输出:

...
...
Same creation time
241.txt
Same creation time
944.txt
Same creation time
908.txt
Same creation time
631.txt
Same creation time
175.txt
Same creation time
798.txt
Same creation time
192.txt
Same creation time
961.txt
Same creation time
476.txt
Same creation time
566.txt
Same creation time
945.txt
Same creation time
681.txt
Same creation time
880.txt
Same creation time
162.txt
Same creation time
634.txt
Same creation time
746.txt
Same creation time
442.txt
Same creation time
35.txt
Same creation time
96.txt
Same creation time
771.txt
Same creation time
787.txt
Same creation time
972.txt
Same creation time
642.txt
Same creation time
495.txt
Same creation time
625.txt
Same creation time
666.txt
Same creation time
660.txt
Same creation time
6.txt
Same creation time
593.txt
Same creation time
549.txt
Same creation time
842.txt
Same creation time
314.txt
Same creation time
148.txt
**1000**

如果我在删除后睡了一段时间(> 30秒),所有文件都会有正确的时间戳。

有没有办法解决这个问题?一些winapi调用删除文件好吗?

2 个答案:

答案 0 :(得分:15)

我相信您在Windows中遇到了一种称为 filesystem tunneling 的现象。这是基于NT的系统的一项功能,其中与同一目录中最近删除的文件同名的新文件将继承旧文件的创建时间。

您可以禁用隧道或更改缓存旧文件数据的时间长度。有关详细信息,请参阅此Microsoft KB article

实现了文件系统隧道,因为许多应用程序将删除并重新创建他们希望更改的文件,而不仅仅是更新它们。

您应该可以使用@Jim Rhodes建议来抵消此功能。

答案 1 :(得分:3)

创建文件后,您可以使用SetFileTime更新创建时间。