Frage

Ich habe einen Hintergrund Arbeiter eine riesige Datei (mehrere GB) zu kopieren, laufen und ich möchte wissen, wie man den Prozess in der Mitte der Kopie abzubrechen. Ich kann überprüfen CancellationPending Eigenschaft vor der Kopie, aber nicht wissen, wie es zu tun ist, wenn Kopie ist bereits im Gange.

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

Bitte beraten, danke!

War es hilfreich?

Lösung

Ich bin mir nicht sicher, aber ich denke, dass File.Copy durch die CopyFile Funktion des winapi gesichert ist, dass diese Funktion nicht erlauben.

Sie sollten weisen auf CopyFileEx , die eine Callback-Methode ermöglicht es, wenn ein Teil der Datei kopiert wurde.

Andere Tipps

Der einzige Weg, den ich kenne, ist CopyFileEx (kernel32)

Soweit ich weiß, sind Hintergrund Arbeiter am besten für viele kleine Operationen ausgeführt werden. Ich weiß, es ist chaotisch, aber Sie könnten einen separaten Thread in der Schaffung für Ihren Kopiervorgang zu suchen. Auf diese Weise, wenn Sie in der Mitte des Kopierens sind, können Sie nur den Faden töten. (Ich bin nicht sicher, was das mit dem Kopieren tun würde, tho. - Ich weiß nicht, ob es eine temporäre Datei hinter der Verwendung dieser Methode lassen würde)

Kopieren Sie die Datei in Stücke schneiden. Zwischen Brocken, überprüfen, ob der Vorgang abgebrochen wurde.

Das ist wie ein Rad neu erfinden riechen kann, aber es ist eine Option, wenn Sie CopyFileEx nicht DllImport wollen.

Statt File.Copy oder andere Kopierfunktion verwenden, können Sie die Datei auch kopieren sich (aus einem Quellstrom Lesen, Schreiben zu einem Zielstrom) in Stücke schneiden. In der Schleife benötigt, um alle Stücke kopieren Sie, ob Abbruch der Operation überprüfen können und führen Sie dann notwendigen Operationen zu Abbruch des Kopiervorgangs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top