Копиране на атомарни файлове под .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 и Background Intelligent Transfer Service API

SharpBITS.NET - обвивка за BITS API

person Oleg I.    schedule 08.02.2010