Domanda

Sto cercando un modo affidabile per copiare file su una condivisione di rete Windows che tolleri la connettività intermittente.L'applicazione viene spesso utilizzata su workstation mobili e wireless nei grandi ospedali e presumo che la connettività possa essere persa momentaneamente o per diversi minuti alla volta.I file coinvolti hanno in genere una dimensione di circa 200 KB - 500 KB.L'applicazione è scritta in VB6 (ugh), ma spesso finiamo per utilizzare chiamate DLL di Windows.

Grazie!

È stato utile?

Soluzione

Non mi è chiaro quale sia il tuo vero problema, quindi farò alcune riflessioni.

  • Vuoi copie riavviabili (con dimensioni di file così piccole, che non sembra essere un grosso problema)?Se è così, guarda CopyFileEx con COPYFILERESTARTABLE
  • Vuoi copie verificabili?Sembra che tu lo abbia già verificando gli hash.
  • Vuoi prestazioni migliori?Sarà difficile, poiché sembra che tu non possa eseguire nulla sul server.Altrimenti, TrasmissioneFile posso aiutare.
  • Vuoi solo un'operazione "incendio e dimentica"?Suppongo che sborsare per robocopy, o TeraCopy o qualcosa potrebbe funzionare, ma mi sembra un po' complicato.
  • Vuoi sapere quando tornerà la rete? La rete è viva ha la tua risposta.

Sulla base di ciò che so finora, penso che il seguente pseudo-codice sarebbe il mio approccio:

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

La prima compressione dei file ti salva il monitoraggio di quali file hai copiato con successo e quali devi riavviare.Dovrebbe anche rendere la copia più veloce (dimensione totale del file più piccola e dimensione del singolo file più grande), a scapito di una certa potenza della CPU su entrambi i lati.Un semplice file batch può decomprimerlo sul lato server.

Altri suggerimenti

ho usato Robocopia per questo con ottimi risultati.Per impostazione predefinita, riproverà ogni 30 secondi finché il file non verrà trasmesso.

Prova a utilizzare BITS (Servizio di trasferimento intelligente in background).È l'infrastruttura utilizzata da Windows Update, accessibile tramite l'API Win32 ed è creata appositamente per risolvere questo problema.

Di solito viene utilizzato per gli aggiornamenti delle applicazioni, ma dovrebbe funzionare bene in qualsiasi situazione di spostamento di file.

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

Sono d'accordo con Robocopy come soluzione... ecco perché si chiama l'utilità "Copia file affidabile"

Ho usato Robocopy per questo con risultati eccellenti.Per impostazione predefinita, riproverà ogni 30 secondi finché il file non verrà trasmesso.

E per impostazione predefinita, un milione di tentativi.Dovrebbe essere sufficiente per la tua connessione intermittente.

Effettua anche trasferimenti riavviabili e puoi anche limitare i trasferimenti con un intervallo tra i pacchetti, presupponendo che non desideri utilizzare tutta la larghezza di banda poiché altri programmi utilizzano la stessa connessione (switch /IPG)?.

Che ne dici di inviare semplicemente un hash dopo o prima di inviare il file e confrontarlo con il file ricevuto?Questo dovrebbe almeno assicurarti di avere un file corretto.

Se vuoi fare il possibile, puoi eseguire lo stesso processo, ma per piccole parti del file.Quindi, quando hai tutti i pezzi, uniscili all'estremità ricevente.

Hm, sembra che rsync lo faccia e non abbia bisogno di server/demone/installazione che pensavo lo facesse - solo $ rsync src dst.

SMS se è disponibile funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top