Мне неясно, какова ваша настоящая проблема, поэтому выкину несколько мыслей.
- Вам нужны перезапускаемые копии (с такими маленькими размерами файлов, которые не кажутся такими уж сложными)? Если это так, посмотрите на CopyFileEx с COPYFILERESTARTABLE
- Вам нужны проверяемые копии? Похоже, у вас уже есть это, проверяя хэши.
- Хотите улучшить производительность? Это будет сложно, так как кажется, что вы ничего не можете запустить на сервере. В противном случае TransmitFile может помочь.
- Вы просто хотите пожар и забыли операцию? Я полагаю, что обстрел из-под робокопии, или TeraCopy , или что-то еще сработает, - но мне это кажется немного глупым.
- Хотите знать, когда сеть вернется? IsNetworkAlive имеет ваш ответ.
Исходя из того, что я знаю до сих пор, я думаю, что следующий подход - мой псевдокод:
sourceFile = Compress("*.*");
destFile = "X:\files.zip";
int copyFlags = COPYFILEFAILIFEXISTS | COPYFILERESTARTABLE;
while (CopyFileEx(sourceFile, destFile, null, null, false, copyFlags) == 0) {
do {
// optionally, increment a failed counter to break out at some point
Sleep(1000);
while (!IsNetworkAlive(NETWORKALIVELAN));
}
Сжатие файлов в первую очередь спасает вас от отслеживания, какие файлы вы успешно скопировали, а какие вам нужно перезапустить. Это также должно ускорить копирование (меньший общий размер файла и больший размер отдельного файла) за счет некоторой мощности ЦП с обеих сторон. Простой командный файл может распаковать его на стороне сервера.