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

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

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

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

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

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


person user256890    schedule 08.02.2010    source источник
comment
См. также: stackoverflow.com/questions/15274861/file-move-atomic -операция   -  person Uwe Keim    schedule 30.12.2015


Ответы (4)


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

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

person Paolo    schedule 08.02.2010


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

person villintehaspam    schedule 08.02.2010

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

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

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

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

person Oleg I.    schedule 08.02.2010