Атомная копия файла под .NET - PullRequest
11 голосов
/ 08 февраля 2010

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

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

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

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

РЕДАКТИРОВАТЬ: целевой ОС является Win2003, поэтому транзакционная NTFS недоступна

Ответы [ 4 ]

10 голосов
/ 08 февраля 2010

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

Ответ на этот похожий вопрос дает больше информации: Атомность файла. Перемещение

2 голосов
/ 08 февраля 2010

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

2 голосов
/ 08 февраля 2010
1 голос
/ 08 февраля 2010

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

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

Создание приложений автообновления с помощью .NET и API фоновой интеллектуальной службы передачи

SharpBITS.NET - оболочка для BITS API

...