Frage

Ich bin auf der Suche für eine robuste Methode zum kopieren von Dateien über eine Windows-Netzwerkfreigabe, die ist tolerant von intermittierenden verbindungen.Die Anwendung ist oft verwendet auf drahtlose, mobile Arbeitsstationen in großen Krankenhäusern, und ich gehe davon aus, dass die Konnektivität verloren gehen können, entweder vorübergehend oder für mehrere Minuten zu einer Zeit.Die betroffenen Dateien sind in der Regel etwa 200 KB - 500KB groß ist.Die Anwendung ist in VB6 geschrieben (ugh), aber wir Häufig am Ende mit Windows-DLL-Aufrufe.

Vielen Dank!

War es hilfreich?

Lösung

Ich bin mir nicht sicher, was Ihre eigentliche problem ist, also werfe ich ein paar Gedanken.

  • Sie wollen neu gestartet, kopiert (mit so kleinen Dateigrößen, die nicht scheinen, wie es sein würde, dass große einen deal)?Wenn ja, schauen CopyFileEx mit COPYFILERESTARTABLE
  • Möchten Sie überprüfbare kopiert?Klingt wie Sie bereits durch die überprüfung der Hashwerte.
  • Willst du bessere Leistung?Es wird hart werden, als es klingt wie Sie nicht ausführen können, etwas auf dem server.Andernfalls TransmitFile kann helfen.
  • Wollen Sie einfach nur einen Feuer-und-vergessen-Vorgang?Ich nehme an, Beschuss aus zu robocopy, oder TeraCopy oder etwas, das funktionieren würde - aber es scheint ein bisschen hacky für mich.
  • Möchten Sie wissen, Wann das Netz kommt zurück? IsNetworkAlive hat Ihre Antwort.

Basierend auf dem, was ich bisher wissen, ich denke, der folgende pseudo-code wäre mein Ansatz:

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));
}

Komprimieren der Dateien spart Sie verfolgen, welche Dateien Sie haben erfolgreich kopiert, und die, die Sie brauchen, um neu zu starten.Es sollte auch das kopieren geht schneller (kleinere Dateigröße, und die größer die Dateigröße einer einzelnen Datei), auf Kosten von einigen CPU-Leistung auf beiden Seiten.Eine einfache batch-Datei entpacken Sie es auf der server-Seite.

Andere Tipps

Ich habe verwendet Robocopy für das mit hervorragenden Ergebnissen.Standardmäßig wird es wiederholen sich alle 30 Sekunden, bis die Datei rüber.

Versuchen Sie, mithilfe von BITS (Background Intelligent Transfer Service).Es ist die Infrastruktur, die die Windows Update verwendet, zugänglich ist, über die Win32-API und ist speziell für diese Adresse.

Es ist in der Regel verwendet für Programm-updates, aber die Arbeit sollte auch in eine Datei verschieben situation.

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

Ich Stimme mit Robocopy als Lösung...das ist, warum Sie das Dienstprogramm aufgerufen wird "Robust File Copy"

Ich habe verwendet Robocopy für diese mit hervorragenden Ergebnissen.Standardmäßig wird es wiederholen sich alle 30 Sekunden, bis die Datei rüber.

Und durch Standard, eine million Wiederholungen.Das sollte genug für Ihre intermittierende Verbindung.

Tut es auch neu gestartet, transfers und Sie können sogar Gas Transfer mit einem Spalt zwischen den Paketen assuing, die Sie nicht verwenden möchten die ganze Bandbreite als andere Programme mit derselben Verbindung (/IPG-Schalter)?.

Wie über möchten, senden Sie einfach einen hash, nachdem oder bevor Sie senden die Datei, und einen Vergleich mit der Datei, die Sie erhalten?Das sollte zumindest machen Sie sicher, Sie haben eine richtige Datei.

Wenn Sie wollen zu gehen, Sie alle heraus, die Sie tun könnten, um den gleichen Vorgang, aber für kleine Teile der Datei.Dann, wenn Sie alle Stücke, verbinden Sie diese auf der Empfängerseite.

Hm, scheint rsync geht es, und nicht benötigen server/daemon/install, ich dachte, Sie tut es - nur $ rsync-src-dst.

SMS, wenn es verfügbar ist, funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top