Мне нужно обновитьвремя созданияфиктивного файла на 'сейчас', удалив его и создав заново. Странно, но вновь созданный файл выглядит так, будто он наследует время создания оригинального файла!
Позвольте мне продемонстрировать:
> 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 / NTFS? Похоже, что происходит кэширование метаданных файлов, а аннулирование кэша ограничено по времени.
Есть ли у вас предложения, как получить совершенно новый файл с тем же именем, что и у оригинального, с обновленным
ctime
? Любые предложения приветствуются, будь то пакетные скрипты, взломы реестра, программные или что-то еще.
решение1
Ответы:
- Этот процесс называется «Туннелирование файловой системы» (выведено из квантовой механики) и, насколько я понимаю, изначально он был разработан для win 95. Он необходим операционной системе для обработки ситуации, когда программа просто сохраняет и перезаписывает файл. В этом случае пользователь обычно ожидает, что дата создания (и короткое имя файла) не изменятся, но без туннелирования дата создания будет отражать время последнего сохранения. Смотрите:Некоторые напоминания о времени файлов Windows,Апокрифическая история туннелирования файловой системы
- Есть два способа решения проблемы:
- путем немедленного изменения времени создания после сохранения/создания
- по настройкам реестра (для всей операционной системы):
Параметры туннелирования файлов контролируются ключом реестра Windows HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem.
Чтобы увеличить время кэширования туннелирования, измените/добавьте значение DWORD MaximumTunnelEntryAgeInSeconds. Время кэширования по умолчанию составляет 15 секунд. Чтобы отключить туннелирование, измените/добавьте значение DWORD MaximumTunnelEntries и установите его равным 0.
решение2
Я не пользуюсь Windows, но, кажется, я нашел обходной путь.
Win32, по-видимому, позволяетизменение времени создания файла, используяSetFileTimeфункция.
Если вы не пишете приложение с Win32, вы должны уметь использовать PowerShell. На основеаналогичный ответ stackoverflow:
C:\> powershell (ls your-file-name-here).CreationTime = Get-Date
решение3
Используйте atime, а не ctime. Время доступа фактически является временем создания, так как оно не обновляется при доступебольше