Файловая система Windows: время создания файла не изменяется при удалении и повторном создании - PullRequest
15 голосов
/ 10 января 2012

У меня есть следующий сценарий:

  • 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 ]

15 голосов
/ 11 января 2012

Я полагаю, что в Windows вы столкнулись с явлением, известным как туннелирование файловой системы . Это особенность систем на базе NT, в которых новый файл с тем же именем, что и недавно удаленный файл в том же каталоге, будет наследовать время создания старого файла.

Вы можете отключить туннелирование или изменить время, в течение которого данные старого файла кэшируются. Подробности см. В статье Microsoft KB .

Туннелирование файловой системы было реализовано, поскольку многие приложения будут удалять и воссоздавать файлы, которые они хотят изменить, а не просто обновлять их.

Вы должны быть в состоянии использовать предложение @Jim Rhodes, чтобы противодействовать этой функции.

3 голосов
/ 10 января 2012

Вы можете использовать SetFileTime для обновления времени создания, как только вы создадите файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...