2008-08-20 12 views
12

Busco una manera robusta para copiar archivos a través de un recurso compartido de red de Windows que es tolerante a la conectividad intermitente. La aplicación se usa a menudo en estaciones de trabajo inalámbricas y móviles en hospitales grandes, y asumo que la conectividad puede perderse momentáneamente o por varios minutos a la vez. Los archivos involucrados son típicamente de aproximadamente 200 KB - 500 KB de tamaño. La aplicación está escrita en VB6 (ugh), pero con frecuencia terminamos usando llamadas a Windows DLL.Copia de archivos a través de una conexión intermitente Red

Gracias!

Respuesta

5

estoy claro en cuanto a lo que el problema real es, por lo que van a echar algunas reflexiones.

  • ¿Desea copias reiniciables (con tamaños de archivo tan pequeños, que no parece que sea tan importante)? Si es así, consulte CopyFileEx with COPYFILERESTARTABLE
  • ¿Desea copias verificables? Parece que ya lo tienes al verificar los hashes.
  • ¿Desea un mejor rendimiento? Va a ser difícil, ya que parece que no se puede ejecutar nada en el servidor. De lo contrario, TransmitFile puede ayudar.
  • ¿Solo desea un fuego y olvida la operación? Supongo que desgranar a robocopy, o TeraCopy o algo funcionaría, pero me parece un poco raro.
  • ¿Desea saber cuándo regresa la red? IsNetworkAlive tiene tu respuesta.

Sobre la base de lo que sé hasta ahora, creo que el siguiente pseudo-código sería mi enfoque:

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 compresión de los archivos en primer lugar le ahorra el seguimiento de los archivos que haya copiado con éxito, y que necesitas reiniciar También debería hacer que la copia sea más rápida (tamaño de archivo total más pequeño y tamaño de archivo único más grande), a expensas de cierta potencia de CPU en ambos lados. Un archivo por lotes simple puede descomprimirlo en el lado del servidor.

5

Intente utilizar BITS (Servicio de transferencia inteligente). Es la infraestructura que usa Windows Update, es accesible a través de la API de Win32 y está específicamente diseñada para solucionar esto.

Por lo general se utiliza para actualizaciones de la aplicación, pero debería funcionar bien en cualquier situación mover archivos.

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

0

¿Qué tal el simple envío de un hash después o antes de enviar el archivo, y comparando con el archivo que ha recibido? Eso debería al menos asegurarse de tener un archivo correcto.

Si quieres ir a por todas que podría hacer el mismo proceso, pero para las pequeñas partes del archivo. Luego, cuando tenga todas las piezas, únase a ellas en el extremo receptor.

+0

Eso es exactamente lo que hace BITS. – TheSmurf

13

que he usado para este Robocopy con excelentes resultados. Por defecto, volverá a intentarlo cada 30 segundos hasta que el archivo se cruce.

+0

Gracias por las sugerencias RoboCopy y CopyFileEx. CopyFileEx, en particular, parece prometedor. Actualmente, la aplicación cliente está utilizando [SHFileOperation] (http://msdn.microsoft.com/en-us/library/bb762164 (VS.85) .aspx) para hacer la copia de archivo real. –

-1

SMS si está disponible funciona.

1

Estoy de acuerdo con Robocopy como solución ...Es por eso que la utilidad se llama "robusto copia de archivos"

he utilizado para este Robocopy con excelentes resultados. Por defecto, volverá a intentarlo cada 30 segundos hasta que el archivo se cruce.

Y de forma predeterminada, un millón de reintentos. Eso debería ser suficiente para su conexión intermitente.

También realiza transferencias reiniciables e incluso puede acelerar las transferencias con un espacio entre paquetes suponiendo que no desea utilizar todo el ancho de banda ya que otros programas utilizan la misma conexión (/ conmutador IPG) ?.

0

Hm, parece que rsync lo hace, y no necesita servidor/daemon/instalo pensé que lo hace - sólo $ dst rsync src.

Cuestiones relacionadas