Копирование файлов через прерывистое сетевое соединение

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

Спасибо!

20.08.2008 15:04:20
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

5
20.08.2008 15:06:53

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

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

0
20.08.2008 15:08:15
Это именно то, что делает BITS.
TheSmurf 20.08.2008 15:13:23

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

13
20.08.2008 21:47:57
Спасибо за предложения RoboCopy и CopyFileEx. В частности, CopyFileEx выглядит многообещающе. В настоящее время клиентское приложение использует SHFileOperation для фактического копирования файла.
Eric Pohl 21.08.2008 21:03:40

СМС при наличии работает.

-1
21.08.2008 21:23:10

Я согласен с Robocopy в качестве решения ... вот почему утилита называется "Robust File Copy"

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

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

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

1
2.09.2008 13:51:57

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

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

0
17.09.2008 05:10:24

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

0
17.09.2008 21:39:25