Pregunta

Tengo un trabajador de fondo corriendo para copiar un archivo grande (varios GB) y me gustaría saber cómo cancelar el proceso en medio de la copia. Puedo comprobar la propiedad CancellationPending antes de la copia, pero no saben cómo hacerlo cuando se copia ya está en progreso.

if (worker.CancellationPending) // check cancellation before copy 
{   
    e.Cancel = true;
}
else
{    
    File.Copy("sourceFile", "destinationFile"); // need to cancel this
}

Por favor, asesorar, gracias!

¿Fue útil?

Solución

No estoy seguro pero creo que File.Copy está respaldado por la función CopyFile de la API de Windows que no permite esta función.

CopyFileEx que permite un método de devolución de llamada cuando una parte del archivo se ha copiado.

Otros consejos

La única forma que conozco es utilizar CopyFileEx (kernel32)

Por lo que yo sé, los trabajadores de fondo son los mejores para correr un montón de pequeñas operaciones. Sé que es complicado, pero es posible que desee ver en la creación de un hilo separado para su operación de copia. De esa manera, si estás en el medio de copia, puede simplemente matar al hilo. (No estoy seguro de lo que haría a la copia, aunque -. No sé si dejaría un archivo temporal detrás del uso de este método)

Copia el archivo en trozos. Entre trozos, comprobar si la operación ha sido cancelada.

Esto puede oler como una reinvención de la rueda, pero es una opción si no desea dllimport CopyFileEx.

En lugar de utilizar File.Copy o cualquier otra función de copia, también se puede copiar el archivo usted mismo (la lectura de un flujo fuente, escribiendo a un flujo de destino) en trozos. En el bucle necesario para copiar todos los trozos se puede comprobar si abortar la operación y luego realizar las operaciones necesarias para abortar el proceso de copia.

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