Избегайте обновления даты и времени последнего доступа при чтении файла - PullRequest
4 голосов
/ 14 апреля 2011

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

В принципе, этот подход кажется отличным, но некоторые клиенты, тестирующие раннюю версию приложения, имеютсообщил, что он изменяет время последнего обращения к большому количеству их файлов (что неудивительно, поскольку он фактически обращается к файлам).Это проблема для этих клиентов, потому что у них есть политики архивирования, основанные на времени последнего обращения к файлам (например, они архивируют файлы, к которым не обращались в течение последних 12 месяцев).Поскольку запланировано, что наше приложение будет запускаться чаще, чем «окно» архива, мы фактически предотвращаем архивирование любого из этих файлов.

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

Итак, вот вопрос: есть ли какой-либо способ вСреда Windows, в которой мы можем прочитать файл без последнего времени обновления?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Несмотря на тег "ntfs", мы на самом деле не можем полагаться нафайловая система NTFS.Многие наши клиенты запускают наше приложение по сети, поэтому на другом конце оно может быть чем угодно.

Ответы [ 3 ]

5 голосов
/ 14 апреля 2011

Документация указывает, что вы можете сделать это, хотя я сам никогда не пробовал.

Чтобы сохранить существующее время последнего доступа к файлу даже после доступа к файлувызовите SetFileTime сразу после открытия дескриптора файла с элементами структуры FILETIME этого параметра, инициализированными в 0xFFFFFFFF.

4 голосов
/ 27 апреля 2011

Начиная с Vista, NTFS по умолчанию не обновляет время последнего доступа. Чтобы включить это см. http://technet.microsoft.com/en-us/library/cc959914.aspx

Запуск транзакции NTFS и откат назад очень плох, а производительность будет ужасной.

Вы также можете сделать

FSUTIL, набор поведений disablelastaccess 0

1 голос
/ 14 апреля 2011

Я не знаю, каковы минимальные требования вашего клиента, но вы пробовали транзакции NTFS? На десктопе первой ОС, поддерживающей его, была Vista, а на сервере - Windows Server 2008. Но, возможно, стоит взглянуть на нее.

Запустите транзакцию NTFS, прочитайте ваш файл, откатите транзакцию. Просто! :-). Я на самом деле не знаю , если это откатит дату последнего доступа, хотя. Вам придется проверить это на себе.

Вот ссылка на статью MSDN Magazine о транзакциях NTFS, которая включает в себя другие ссылки. http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

Надеюсь, это поможет.

...