Подтвердить что ты не робот

Атомная копия файла в .NET.

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

После перезапуска службы я смогу подобрать задачи копирования и продолжить. Как определить, успешно ли завершена или прервана копия сервера?

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

Есть ли у вас хорошие/лучшие предложения?

EDIT: целевая ОС - Win2003, поэтому транзакционная NTFS недоступна

4b9b3361

Ответ 1

Другие предложили транзакционную NTFS, которая прекрасна, если вы развертываете Vista или более позднюю версию. Если вам нужно поддерживать XP (или ранее), то лучшим решением будет временный файл, за которым следует переход (переименование).

Ответ на этот похожий вопрос дает дополнительную информацию: Атомность файла .Move

Ответ 3

Более новые версии Windows позволяют использовать транзакции.

Ответ 4

Отметьте Фоновая интеллектуальная служба передачи в Windows Server 2003. Он обеспечивает механизм рабочих мест, которые могут быть приостановлены и возобновлены даже после перезапуска.

Вот несколько примеров, как использовать его с .NET:

Записать приложения для автоматического обновления с помощью .NET и API Intelligence Transfer API

SharpBITS.NET - обертка для BITS API