Domanda

Ho un lavoratore in background in esecuzione di copiare un file enorme (diversi GB) e mi piacerebbe sapere come annullare il processo nel mezzo della copia. Posso controllare proprietà CancellationPending prima della copia, ma non so come si fa quando si copia è già in corso.

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

Si prega di comunicare, grazie!

È stato utile?

Soluzione

Non sono sicuro, ma penso che File.Copy è sostenuta dalla funzione CopyFile del WinAPI che non supporta questa funzione.

Si dovrebbe puntare verso CopyFileEx che consente a un metodo di callback ogni volta che un parte del file è stato copiato.

Altri suggerimenti

L'unico modo che conosco è quello di utilizzare CopyFileEx (kernel32)

Per quanto ne so, fondo lavoratori sono i migliori per l'esecuzione di un sacco di piccole operazioni. Lo so che è disordinato, ma si potrebbe voler esaminare la creazione di un thread separato per la vostra operazione di copia. In questo modo, se siete nel bel mezzo di copiare, si può semplicemente uccidere il thread. (Non sono sicuro che cosa questo farebbe per la copia, tho -. Non so se avrebbe lasciato un file temporaneo che sta dietro all'uso di questo metodo)

Copiare il file in blocchi. Tra pezzi, controllare se l'operazione è stata annullata.

Questo può odore come una reinvenzione della ruota, ma è un'opzione se non si vuole DllImport CopyFileEx.

Invece di usare File.Copy o di qualsiasi altra funzione di copia, si potrebbe anche copiare il file da soli (la lettura da un flusso di origine, scrivendo a un flusso di destinazione) in blocchi. Nel circuito necessari per copiare tutti i pezzi si potrebbe verificare se per annullare l'operazione e quindi eseguire le operazioni necessarie per interrompere il processo di copia.

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