Я ищу надежный способ копирования файлов через общий сетевой ресурс Windows, который допускает прерывистое подключение. Приложение часто используется на беспроводных, мобильных рабочих станциях в крупных больницах, и я предполагаю, что связь может быть потеряна на мгновение или на несколько минут за раз. Размер используемых файлов обычно составляет от 200 до 500 КБ. Приложение написано на VB6 (тьфу), но мы часто используем вызовы Windows DLL.
Спасибо!
Мне неясно, какова ваша настоящая проблема, поэтому выкину несколько мыслей.
- Вы хотите перезапускаемые копии (с такими маленькими размерами файлов, которые не кажутся такими уж сложными)? Если это так, посмотрите на 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));
}
Сжатие файлов в первую очередь спасает вас от отслеживания того, какие файлы вы успешно скопировали и какие вам нужно перезапустить. Это также должно ускорить копирование (меньший общий размер файла и больший размер отдельного файла) за счет некоторой мощности ЦП с обеих сторон. Простой командный файл может распаковать его на стороне сервера.
Попробуйте использовать BITS (Background Intelligent Transfer Service). Это инфраструктура, используемая Центром обновления Windows, доступная через Win32 API и созданная специально для этого.
Обычно он используется для обновления приложений, но должен хорошо работать в любой ситуации с перемещением файлов.
Как насчет простой отправки хэша после или до отправки файла и сравнения его с файлом, который вы получили? Это должно по крайней мере убедиться, что у вас есть правильный файл.
Если вы хотите сделать все возможное, вы можете сделать тот же процесс, но для небольших частей файла. Затем, когда у вас есть все фигуры, соедините их на приемном конце.
Я использовал Robocopy для этого с отличными результатами. По умолчанию, он будет повторяться каждые 30 секунд, пока файл не попадет.
СМС при наличии работает.
Я согласен с Robocopy в качестве решения ... вот почему утилита называется "Robust File Copy"
Я использовал Robocopy для этого с отличными результатами. По умолчанию, он будет повторяться каждые 30 секунд, пока файл не попадет.
И по умолчанию миллион повторов. Это должно быть достаточно для вашего прерывистого соединения.
Он также выполняет перезапускаемые передачи, и вы можете даже регулировать передачу с промежутком между пакетами, предполагая, что вы не хотите использовать всю полосу пропускания, поскольку другие программы используют то же соединение (/ IPG-переключатель) ?.
Вы можете использовать Microsoft SyncToy (бесплатно).
Хм, кажется, rsync это делает, и ему не нужен сервер / демон / установка, как я и думал - просто $ rsync src dst.