Подтвердить что ты не робот

Копирование файлов по прерывистому сетевому соединению

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

Спасибо!

4b9b3361

Ответ 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

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

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

Ответ 7

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

Ответ 8

SMS, если оно доступно.