Копирование файлов через прерывистое сетевое соединение - PullRequest
13 голосов
/ 20 августа 2008

Я ищу надежный способ копирования файлов через общий сетевой ресурс Windows, который допускает прерывистое подключение. Приложение часто используется на беспроводных, мобильных рабочих станциях в крупных больницах, и я предполагаю, что связь может быть потеряна на мгновение или на несколько минут за раз. Размер используемых файлов обычно составляет от 200 до 500 КБ. Приложение написано на VB6 (тьфу), но мы часто в конечном итоге используем вызовы Windows DLL.

Спасибо!

Ответы [ 8 ]

13 голосов
/ 21 августа 2008

Я использовал Robocopy для этого с отличными результатами. По умолчанию он будет повторяться каждые 30 секунд, пока файл не попадет.

5 голосов
/ 21 августа 2008

Мне неясно, какова ваша настоящая проблема, поэтому выкину несколько мыслей.

  • Вам нужны перезапускаемые копии (с такими маленькими размерами файлов, которые не кажутся такими уж сложными)? Если это так, посмотрите на 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));
}

Сжатие файлов в первую очередь спасает вас от отслеживания, какие файлы вы успешно скопировали, а какие вам нужно перезапустить. Это также должно ускорить копирование (меньший общий размер файла и больший размер отдельного файла) за счет некоторой мощности ЦП с обеих сторон. Простой командный файл может распаковать его на стороне сервера.

5 голосов
/ 20 августа 2008

Попробуйте использовать BITS (Background Intelligent Transfer Service). Это инфраструктура, используемая Центром обновления Windows, доступная через Win32 API и созданная специально для решения этой проблемы.

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

http://www.codeproject.com/KB/IP/bitsman.aspx

1 голос
/ 02 сентября 2008

Я согласен с Robocopy как решением ... вот почему утилита называется "Надежная копия файла"

Я использовал Robocopy для этого с отличными результатами. По умолчанию он будет повторяться каждые 30 секунд, пока файл не попадет.

И по умолчанию миллион повторов. Этого должно быть достаточно для прерывистой связи.

Он также выполняет перезапускаемые передачи, и вы можете даже регулировать передачу с разрывом между пакетами, если вы не хотите использовать всю полосу пропускания, поскольку другие программы используют такое же соединение (/ IPG-переключатель)?.

0 голосов
/ 18 сентября 2008

Хм, кажется, что rsync это делает, и ему не нужен сервер / демон / установка, я думал, что это нужно - просто $ rsync src dst.

0 голосов
/ 17 сентября 2008

Вы можете использовать Microsoft SyncToy (бесплатно).

http://www.microsoft.com/Downloads/details.aspx?familyid=C26EFA36-98E0-4EE9-A7C5-98D0592D8C52&displaylang=en

0 голосов
/ 22 августа 2008

СМС, если доступно, работает.

0 голосов
/ 20 августа 2008

Как насчет простой отправки хэша после или до отправки файла и сравнения его с полученным файлом? Это должно по крайней мере убедиться, что у вас есть правильный файл.

Если вы хотите сделать все возможное, вы можете сделать тот же процесс, но для небольших частей файла. Затем, когда у вас есть все фигуры, соедините их на приемном конце.

...