Копирование файлов по прерывистому сетевому соединению
Я ищу надежный способ скопировать файлы через общий сетевой ресурс Windows, который терпим к прерывистому подключению. Приложение часто используется на беспроводных мобильных станциях в крупных больницах, и я предполагаю, что связь может быть потеряна либо на мгновение, либо на несколько минут за раз. Обычно файлы составляют около 200 КБ - 500 КБ. Приложение написано на VB6 (ugh), но мы часто получаем вызовы Windows DLL.
Спасибо!
Ответы
Ответ 1
Непонятно, какова ваша фактическая проблема, поэтому я вышлю несколько мыслей.
- Вы хотите перезагружать копии (с такими небольшими размерами файлов, что не похоже, что это было бы большой сделкой)? Если это так, посмотрите CopyFileEx с COPYFILERESTARTABLE
- Вы хотите проверять копии? Похоже, у вас уже есть это, проверяя хеши.
- Вам нужна лучшая производительность? Это будет сложно, так как кажется, что вы ничего не можете запустить на сервере. В противном случае TransmitFile может помочь.
- Вы просто хотите пожара и забыли операцию? Я полагаю, что обрезание для robocopy, или 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));
}
Сжатие файлов сначала сохраняет отслеживание файлов, которые вы успешно скопировали, и которые необходимо перезапустить. Он также должен сделать копию быстрее (меньший общий размер файла и больший размер одного файла) за счет некоторой мощности процессора с обеих сторон. Простой командный файл может распаковать его на стороне сервера.
Ответ 2
Я использовал Robocopy для этого с отличными результатами. По умолчанию он будет повторять каждые 30 секунд, пока файл не перейдет.
Ответ 3
Попробуйте использовать BITS (Фоновая интеллектуальная служба передачи). Это инфраструктура, которую использует Windows Update, доступна через Win32 API и специально разработана для решения этой проблемы.
Обычно он используется для обновлений приложений, но должен хорошо работать в любой ситуации с перемещением файлов.
http://www.codeproject.com/KB/IP/bitsman.aspx
Ответ 4
Я согласен с Robocopy в качестве решения... вот почему утилита называется "Robust File Copy"
Я использовал Robocopy для этого с отличными результатами. По умолчанию он будет повторять каждые 30 секунд, пока файл не перейдет.
И по умолчанию миллион попыток. Это должно быть много для вашей прерывистой связи.
Он также перезапускает передачи, и вы даже можете дросселировать переводы с разрывом между пакетами, которые вы не хотите использовать всю пропускную способность, поскольку другие программы используют одно и то же соединение (переключатель IPG).
Ответ 5
Как просто отправить хэш после или перед отправкой файла и сравнить его с файлом, который вы получили? Это должно по крайней мере убедиться, что у вас есть правильный файл.
Если вы хотите изо всех сил, вы можете сделать тот же процесс, но для небольших частей файла. Затем, когда у вас есть все части, присоединитесь к ним на принимающей стороне.
Ответ 6
Вы можете использовать Microsoft SyncToy (бесплатно).
http://www.microsoft.com/Downloads/details.aspx?familyid=C26EFA36-98E0-4EE9-A7C5-98D0592D8C52&displaylang=en
Ответ 7
Hm, похоже, что rsync делает это и не нуждается в сервере /daemon/install, я думал, что это так - просто $rsync src dst.
Ответ 8
SMS, если оно доступно.