Избегайте обновления даты и времени последнего доступа при чтении файла
Мы создаем приложение для Windows, которое рекурсивно обходит структуру каталогов, ищет файлы, которые соответствуют определенным критериям, а затем выполняет некоторую обработку для них. Чтобы решить, обрабатывать ли конкретный файл или нет, мы должны открыть этот файл и прочитать его содержимое.
В принципе, этот подход кажется великолепным, но некоторые клиенты, тестирующие раннюю версию приложения, сообщают, что он изменяет время последнего обращения к большому количеству их файлов (что неудивительно, поскольку он фактически обращается к файлам). Это проблема для этих клиентов, потому что у них есть политики архивирования, основанные на времени последнего обращения к файлам (например, они архивируют файлы, к которым не обращались в течение последних 12 месяцев). Поскольку запланировано, что наше приложение будет запускаться чаще, чем "окно" архива, мы фактически предотвращаем архивирование любого из этих файлов.
Мы попытались добавить некоторый код, чтобы сохранить время последнего доступа к каждому файлу перед его чтением, а затем записать его обратно (безобразно, я знаю), но это вызвало проблемы у другого клиента, который делал инкрементные резервные копии на основе журнала транзакций файловой системы. Наш явный параметр времени последнего обращения к файлам заставлял эти файлы включаться в каждую инкрементную резервную копию, даже если они на самом деле не менялись.
Итак, вот вопрос: есть ли какой-либо способ в среде Windows, чтобы мы могли прочитать файл без обновления времени последнего доступа?
Заранее спасибо!
РЕДАКТИРОВАТЬ: Несмотря на тег "ntfs", мы на самом деле не можем полагаться на файловую систему NTFS. Многие наши клиенты запускают наше приложение по сети, поэтому на другом конце оно может быть чем угодно.
3 ответа
Документация указывает, что вы можете сделать это, хотя я никогда не пробовал сам.
Чтобы сохранить существующее время последнего доступа к файлу даже после доступа к файлу, вызовите SetFileTime сразу после открытия дескриптора файла с элементами структуры FILETIME этого параметра, инициализированными в 0xFFFFFFFF.
Начиная с Vista NTFS не обновляет время последнего доступа по умолчанию. Чтобы включить это, см. http://technet.microsoft.com/en-us/library/cc959914.aspx
Запуск транзакции NTFS и откат назад очень плох, а производительность будет ужасной.
Вы также можете сделать
FSUTIL поведенческий набор disablelastaccess 0
Я не знаю, каковы минимальные требования вашего клиента, но вы пробовали транзакции NTFS? На десктопе первой ОС, поддерживающей его, была Vista, а на сервере - Windows Server 2008. Но, возможно, стоит взглянуть.
Запустите транзакцию NTFS, прочитайте ваш файл, откатите транзакцию. Просто!:-). Я на самом деле не знаю, будет ли это откат Дата последнего доступа, хотя. Вы должны будете проверить это для себя.
Вот ссылка на статью MSDN Magazine о транзакциях NTFS, которая включает другие ссылки. http://msdn.microsoft.com/en-us/magazine/cc163388.aspx
Надеюсь, поможет.