Я думал о создании небольшого специализированного приложения для резервного копирования, похожего на недавно введенную историю файлов в Windows 8. Основная идея — сканировать некоторые каталоги каждые N часов на наличие измененных файлов и копировать их на другой том. Проблема заключается в том, что некоторые другие приложения могут запрашивать доступ к этим файлам во время их резервного копирования и получать отказ в доступе, что может привести к всевозможным неприятным проблемам.
Я, насколько я могу судить, есть несколько подходов к этой проблеме:
1) Использование сервиса Volume Shadow Copy
С моей точки зрения, будущее этой вещи неясно, и это накладные расходы при высоких нагрузках ввода-вывода может нанести вред системе.
2) Использование режима общего доступа при открытии файлов
Нечто подобное в основном работает …
using (var stream = new FileStream("test.txt", FileMode.Open, FileAccess.Read,
FileShare.Delete | FileShare.ReadWrite | FileShare.Read | FileShare.Write))
{
[Copy data]
}
… пока какой-то другой процесс не запросит доступ к тому же файлу без FileShare.Read, после чего будет сгенерировано исключение IOException.
3) Использование Оппортунистический замок это может быть «сломано» другими (написать?) запросами.
это Поведение FileIO.ReadTextAsync выглядит точно так же, как я хочу, но оно также выглядит очень специфичным для реализации и может быть изменено в будущем. Кто-нибудь знает, как явно заблокировать файл локально через C # или C ++?
Может быть, есть какой-то простой метод C #, такой как File.TryReadBytes, который обеспечивает такое «вежливое» чтение? Я заинтересован в решениях, которые будут работать на Windows 7 и выше.
Мой голос за VSS. Основная причина в том, что он не мешает другим процессам, изменяющим ваши файлы, таким образом, он обеспечивает согласованность. Возможное несоответствие в значительной степени побеждает цель резервного копирования. API стабильный, и я не буду беспокоиться о его будущем.