Vorgang des Datei kopierens abbrechen

Thoruss

Grünschnabel
Hallo,

ich möchte eine Datei kopieren und benutze dazu die FileInfo.Copy-Methode. Dies funktioniert auch, wie es sollte, nur leider kann ich den Kopiervorgang nicht mehr abbrechen.

Ich habe das Kopieren in einen Thread verlagert und dieser wird per Knopftdruck gestartet. Man kann die Anwendung dann weiterhin benutzen und wenn ich auf einen Abbrechen-Button klicke, möchte ich den Kopiervorgang beenden. Dazu habe ich im Abbrechen-Button die Abort()-Methode aufgerufen. Die Exception ist behandelt, die dann ausgelöst wird. Nur leider wird die Exception erst dann ausgelöst nachdem der Kopiervorgang beendet ist. Ich möchte aber, dass der Kopiervorgang sofort abgebrochen wird, so wie im Windows Explorer. Ich habe dazu zum testen eine 500MB Datei genommen, damit ich auch die Chance habe abzubrechen und es nicht schon vorher fertig ist.

Desweiteren wäre eine Fortschrittsanzeige wie beim Windows Explorer vorteilhaft, was aber erst einmal nicht so wichtig ist, da es nur der Anzeige dient. Falls da jemand weiß, wie man da rangehen kann oder ob man dazu andere Methoden benutzen muss.

Ich benutze Microsoft Visual C# 2005 Express Edition (.NET 2.0).

Gruß Thorus
 
Zuletzt bearbeitet:
Ich habs zwar probiert an vielen Stellen das hinzuschreiben, auch vor und nach Copy, aber wie erwartet leider nichts gebracht. Solange er in der Copy-Methode ist, kommt er ja gar nicht zu der Codezeile, weswegen das nicht so viel bringt.

Außerhalb wird das Abort() schon dann ausgeführt, wenn man abbrechen möchte, nur zur Exception im Thread kommt es erst, wenn die Copy-Methode zu ende geführt wurde.
 
Hi Thoruss!

Willkommen in Form!

Um den Vorgang abzubrechen, musst Du das Kopieren selber übernehmen. Dafür benötigst 2 FileStreams und kopierst alles stückchenweise (zB. 4096 Bytes) in einem Thread. Wie Du den Thread anhalten kannst, siehst in diesem [thread=210935]Thread Hilfe, wie beenden? -Thread[/thread]. Schau Dir da auch die weiteren [thread=199136]Vorschläge[/thread] mal an...
 
Danke :)

Ich werde mich mit Threads wohl doch noch etwas mehr beschäftigen müssen, wie ich bei den Links gesehen habe.

Noch zu der eigenen Copy-Methode. Das was mich davon abhält, ist, dass die eigene Methode dann vermutlich weniger effizient ist, wie die vorgefertigte Methode. Und gerade beim Kopieren von vielen Dateien und auch großen Dateien könnte das dann doch schon größere Performance-Einbuße ergeben. Kann man irgendwie in die .NET Methoden reinschauen, wie diese programmiert sind? Dann könnte man da leichter was hinzufügen. MSDN benutze ich zwar regelmäßige und ist auch sehr übersichtlich und ausführlich, aber das interne der Methoden habe ich noch nicht gesehen.
 
Ich habe grad mal geguckt wie die Methode File.Copy intern aussieht und ist vielleicht doch nicht so eine gute Idee da einzugreifen. Was da alles noch so abgefragt wird.

Ist aber auch nicht schlimm. Werde ich mit den zwei Streams machen und dann mittels Geschwindigkeitstest mal gucken, dass es nicht wesentlich langsamer dauert.
 
Ich hab doch noch eine Frage, aber eher eine Verständnisfrage.

Ich benutze weiterhin Abort() um den Thread abzuhalten und das funktioniert auch so wie es soll. Hat das irgendwelche Nachteile gegenüber dem Konstrukt while (bedingung) ?

Ich habe mal statt nur eine Datei zu kopieren, einen ganzen Ordner kopiert. Dann steht da also statt File.Copy() die Methode des Ordner kopierens (durch Rekursion).
Mit Abort() bricht er mitten in der Rekursion ab, es werden also nicht mehr alle Dateien im Ordner weiterkopiert. Aber bei der Datei, wo er grad am kopieren ist mit File.Copy() (in der Rekursion), bricht er nicht ab.
Nach welchen Kriterien wird den abbgebrochen? Beides mal sind es Methoden (File.Copy und Order kopieren), aber bei einer bricht er intern nicht ab, bei der anderen aber ja.

Das Abort() die Rekursion abbricht ist gewünscht, ist wie gesagt nur eine Verständnisfrage.

Desweiteren habe ich noch eine andere Frage zum Abbruch ohne Abort(). Kann man bei Rekursionen mit Abbruchbedingungen das irgendwie geschickt anstellen, das zu implementieren? Also bei einer Rekursion wie Ordner kopieren, würde es ja noch gehen, weil man da im unteresten Zwerg jeweils die Abbruchbedingung prüfen könnte. Aber ist ja auch denkbar, dass man mehrere inneranderverschachteltete Rekursionen hat, wo mehrere untereste Operationen denkbar sind. Dann müsste man ja bei allen im Code eine abbruchbedingung reinsetzen, was umständlich und ünübersichtlich wäre.

Ich weiß, dass man theoretisch jede Rekursion in die Form while(bedingung) {Code] bringen kann, aber ist wie gesagt nur theoretisch und praktisch nicht immer sinnvoll.
 
Eine Abbruch-Bedingung wird benötigt, wenn man sicher stellen muss, dass der aktuelle Durchlauf abgeschlossen wird, bevor der Thread terminiert wird. Sowieso benötigt man bei einer Rekursion keine while-Schleife. Die wird ja nur einmal durchlaufen...
Wenn Du die Rekursion mit Abort abbrichst, kannst das nur festzustellen, indem Du die ThreadAbortException in jedem rekursiven Aufruf behandelst.
 
Zurück