Question

J'ai un travailleur de fond en cours d'exécution pour copier un fichier énorme (plusieurs SGB) et je voudrais savoir comment annuler le processus au milieu de la copie. Je peux vérifier la propriété CancellationPending avant la copie, mais ne sais pas comment le faire lorsque la copie est déjà en cours.

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

S'il vous plaît conseiller, merci!

Était-ce utile?

La solution

Je ne suis pas sûr, mais je pense que File.Copy est soutenu par la fonction CopyFile du winapi qui ne permet pas cette fonction.

Vous devriez pointer vers CopyFileEx qui permet une méthode de rappel à chaque fois qu'un partie du fichier a été copié.

Autres conseils

La seule façon que je connaisse est d'utiliser CopyFileEx (kernel32)

Pour autant que je sache, les travailleurs de fond sont les meilleurs pour exécuter beaucoup de petites opérations. Je sais qu'il est en désordre, mais vous pourriez regarder dans la création d'un thread séparé pour votre opération de copie. De cette façon, si vous êtes au milieu de la copie, vous pouvez simplement tuer le fil. (Je ne sais pas ce que cela ferait à la copie, tho -. Je ne sais pas si ce serait laisser un fichier temporaire derrière l'utilisation de cette méthode)

Copiez le fichier en morceaux. Entre les morceaux, vérifier si l'opération a été annulée.

Cela peut sentir comme une réinvention de la roue, mais il est une option si vous ne voulez pas DllImport CopyFileEx.

Au lieu d'utiliser File.Copy ou toute autre fonction de copie, vous pouvez également copier le fichier vous-même (la lecture d'un flux source, l'écriture à un flux de destination) en morceaux. Dans la boucle nécessaire pour copier tous les morceaux que vous pouvez vérifier si pour annuler l'opération, puis effectuer les opérations nécessaires pour annuler le processus de copie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top