Pregunta

Estoy buscando una manera robusta para copiar archivos a través de una red de Windows compartir que es tolerante con conectividad intermitente.La aplicación se utiliza a menudo en los inalámbrico, estaciones de trabajo móviles en los grandes hospitales, y estoy suponiendo que la conectividad puede ser perdido, ya sea momentáneamente o por varios minutos a la vez.Los archivos implicados son típicamente de 200 kb - 500KB de tamaño.La aplicación está escrita en VB6 (ugh), pero que con frecuencia terminan usando la DLL de Windows llamadas.

Gracias!

¿Fue útil?

Solución

Estoy claro en cuanto a lo de tu problema real es, así que voy a tirar un par de ideas.

  • ¿Quieres reiniciables copias (con un tamaño de archivo pequeño, que no parece que sería un gran problema)?Si es así, mira en CopyFileEx con COPYFILERESTARTABLE
  • ¿Quieres verificable copias?Suena como que usted tiene ya que mediante la verificación de hash.
  • ¿Quieres un mejor rendimiento?Va a ser dura, ya que parece que no se puede ejecutar nada en el servidor.De lo contrario, TransmitFile pueden ayudar.
  • No te quieren sólo un fuego y olvidarse de la operación?Supongo que los bombardeos a cabo para robocopy, o TeraCopy o algo de trabajo pero parece un poco chapucero para mí.
  • ¿Quieres saber cuando la red viene de vuelta? IsNetworkAlive tiene su respuesta.

Basado en lo que sabemos hasta el momento, creo que el siguiente pseudo-código sería mi planteamiento:

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, usted ahorra el seguimiento de que los archivos se han copiado correctamente, y que es necesario reiniciar.También debe hacer que la copia de ir más rápido (menor tamaño total del archivo, y solo más grande el tamaño del archivo), en detrimento del poder de la CPU en ambos lados.Un simple archivo de proceso por lotes puede descomprimirlo en el servidor.

Otros consejos

He usado Robocopy para esto, con excelentes resultados.De forma predeterminada, se reintentar cada 30 segundos hasta que el archivo se obtiene a través de.

Trate de usar BITS (Background Intelligent Transfer Service).Es la infraestructura que Windows Update se utiliza, es accesible a través de la API de Win32, y está construido específicamente para abordar este.

Es generalmente utilizado para las actualizaciones de la aplicación, pero debería funcionar bien en cualquier archivo de mover situación.

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

Estoy de acuerdo con Robocopy como una solución...es por eso que la utilidad se llama "Copia De Archivos Robusto"

He usado Robocopy para ello con excelentes resultados.De forma predeterminada, se reintentar cada 30 segundos hasta que el archivo se obtiene a través de.

Y, por defecto, un millón de reintentos.Que debería ser suficiente para su conexión intermitente.

También hace reiniciables transferencias y usted puede incluso acelerador transferencias con un espacio entre los paquetes assuing usted no desea utilizar todo el ancho de banda como otros programas están usando la misma conexión (/IPG interruptor)?.

Cómo se trata de simplemente enviar un hash después o antes de enviar el archivo, y la comparación que con el archivo que usted recibió?Que al menos debe asegurarse de que usted tiene un archivo correcto.

Si quieres ir a por todas que usted podría hacer el mismo proceso, pero para las pequeñas partes del archivo.Entonces, cuando usted tiene todas las piezas, únete a ellos en el extremo receptor.

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

SMS si está disponible obras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top