File.GetLastWriteTime, похоже, возвращает устаревшее значение - PullRequest
7 голосов
/ 03 апреля 2012

Я написал инструмент для сбора файлов журнала в пределах временного окна, указанного пользователем инструмента.До сих пор я основывал коллекцию файлов журналов с помощью метода File.GetLastWriteTime на файлах журналов, сравнивая это со временем, которое пользователь ввел, и собирая на основе результатов этих сравнений.Вот небольшой фрагмент кода:

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile);

Однако я заметил, что мой инструмент не собирал некоторые файлы журналов, которые, как я думал, следовало бы сделать.Похоже, что DateTime, возвращенный этим методом, устарел (в файле было зарегистрировано более свежее время, чем значение этого datetime).

Когда я посмотрел «Дата изменения» рассматриваемого файлаэто также было «устарело», в файл было внесено более свежее сообщение, чем «Дата изменения».

Как я могу получить точное значение 'GetLastWriteTime' или Дата изменения?

Ответы [ 2 ]

10 голосов
/ 03 апреля 2012

Во время моего опыта я пошла бросить пару вопросов, как у вас.В системах Windows Vista / 7, которые работают , не всегда возвращает надежный результат.

Через некоторое время мы нашли эту ссылку: Отключение времени последнего доступа в Windows Vista для повышения производительности NTFS

Наблюдательный пользователь Windows Vista заметил реестр с именем NtfsDisableLastAccessUpdate под HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlFileSystem и спросил нас, что это значит.

Время последнего доступа - это атрибут файла, который обновляется при доступе к файлу или иным образом.(Это часто путают с Last Modified Time , который обновляется только при изменении файла.) Время последнего доступа имеет слабую гранулярность, которая гарантирует, что время точно с точностью до одного часа.

В Windows Vista мы отключили обновления времени последнего доступа для повышения производительности NTFS.Если вы используете приложение, использующее это значение, вы можете включить его с помощью следующей команды:

fsutil behavior set disablelastaccess 0

Необходимо перезагрузить компьютер, чтобы изменения вступили в силу.Для получения дополнительной информации о команде Fsutil и времени последнего доступа см. Интерактивную справку Fsutil .

На основании этого выяснилось, что время последнего доступа не может использоваться в качестве "сильного ключа".Чтобы решить эту проблему, мы просто прекращаем ретрансляцию при вызове GetLastWriteTime, но сохраняем последнее измененное значение файла или его имя, например "FileName_yyyymmdd", или внутри этого файла в каком-то поле.

Существует другое решение для GetLastAccessTime, которое можно найти здесь:

.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime неверны , может быть полезно и в вашем случае.

Мое общее мнение по этому поводу будет таким: не передавайте этот параметр, а придумывайте что-то еще в своей архитектуре.

Удачи

1 голос
/ 05 июля 2012

Тигран прав:

Вы можете попытаться сравнить изменения размера файла в дополнение к времени последней записи. Это то, что я делаю (с FileSystemWatcher, но это похоже на сравнение полей во временном окне).

...