Файловая система Windows 7: Flabbergasted - Удалить и создать заново файл: время создания не меняется! Почему и как исправить?

Файловая система Windows 7: Flabbergasted - Удалить и создать заново файл: время создания не меняется! Почему и как исправить?

Мне нужно обновитьвремя созданияфиктивного файла на 'сейчас', удалив его и создав заново. Странно, но вновь созданный файл выглядит так, будто он наследует время создания оригинального файла!

Позвольте мне продемонстрировать:

> 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

На этом моя демонстрация заканчивается. Возникают два вопроса:

Что за фигня?!

  1. ^^^ Что он сказал.

  2. Как это исправить?

Хорошо, позвольте мне рассказать об этом подробнее:

  1. Кто-нибудь знает, каковы внутренние механизмы ОС Windows / NTFS? Похоже, что происходит кэширование метаданных файлов, а аннулирование кэша ограничено по времени.

  2. Есть ли у вас предложения, как получить совершенно новый файл с тем же именем, что и у оригинального, с обновленным ctime? Любые предложения приветствуются, будь то пакетные скрипты, взломы реестра, программные или что-то еще.

решение1

Ответы:

  1. Этот процесс называется «Туннелирование файловой системы» (выведено из квантовой механики) и, насколько я понимаю, изначально он был разработан для win 95. Он необходим операционной системе для обработки ситуации, когда программа просто сохраняет и перезаписывает файл. В этом случае пользователь обычно ожидает, что дата создания (и короткое имя файла) не изменятся, но без туннелирования дата создания будет отражать время последнего сохранения. Смотрите:Некоторые напоминания о времени файлов Windows,Апокрифическая история туннелирования файловой системы
  2. Есть два способа решения проблемы:
  • путем немедленного изменения времени создания после сохранения/создания
  • по настройкам реестра (для всей операционной системы):

Параметры туннелирования файлов контролируются ключом реестра Windows HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem.

Чтобы увеличить время кэширования туннелирования, измените/добавьте значение DWORD MaximumTunnelEntryAgeInSeconds. Время кэширования по умолчанию составляет 15 секунд. Чтобы отключить туннелирование, измените/добавьте значение DWORD MaximumTunnelEntries и установите его равным 0.

решение2

Я не пользуюсь Windows, но, кажется, я нашел обходной путь.

  1. Win32, по-видимому, позволяетизменение времени создания файла, используяSetFileTimeфункция.

  2. Если вы не пишете приложение с Win32, вы должны уметь использовать PowerShell. На основеаналогичный ответ stackoverflow:

    C:\> powershell  (ls your-file-name-here).CreationTime = Get-Date
    

решение3

Используйте atime, а не ctime. Время доступа фактически является временем создания, так как оно не обновляется при доступебольше

Связанный контент