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

StackOverflow https://stackoverflow.com/questions/18172

Вопрос

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

Спасибо!

Это было полезно?

Решение

Мне неясно, в чем на самом деле заключается ваша проблема, поэтому я выскажу несколько мыслей.

  • Вам нужны перезапускаемые копии (с такими маленькими размерами файлов, что не кажется, что это было бы такой уж большой проблемой)?Если это так, посмотрите на CopyFileEx с COPYFILERESTARTABLE
  • Вам нужны поддающиеся проверке копии?Похоже, у вас уже есть это, проверив хэши.
  • Вы хотите улучшить производительность?Это будет непросто, так как похоже, что вы ничего не можете запустить на сервере.В противном случае, Передающий файл может помочь.
  • Вы просто хотите разжечь костер и забыть об операции?Я полагаю, что перейду на robocopy, или Теракопия или что-то сработало бы - но мне это кажется немного халтурным.
  • Вы хотите знать, когда сеть восстановится? 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));
}

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Работает SMS-сообщение, если оно доступно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top