@mm1256
Also deine FileCopy-Routine ist echt grausam ... wer hat die denn verbrochen?
Ich wollte die gerade etwas überarbeiten, aber das kommt ja einem neu schreiben gleich.
- Statt einem String
als Rückgabe verwende Exceptions
- Solche Exceptions raise Exception.Create('Da hat der Programmierer was vergessen');
sind nicht gerade aussagekräftig. Mach es doch richtig:
Delphi-Quellcode:
case FileCopyMode of
...
else raise ENotImplemented.CreateFmt('FileCopyMode %s nicht implementiert', [GetEnumName( TypeInfo(TFileCopyMode), Ord( FileCopyMode )]);
end;
und du bekommst die Fehlermeldung
Zitat:
FileCopyMode fcmFoo nicht implementiert
- Statt TStream.ReadBuffer solltest du TStream.Read verwenden, dann bekommst du automatisch die Anzahl der echten gelesenen Bytes zurück. Dann weißt du auch wieviel du schreiben musst
- Statt einer TFileCopyCallback = procedure(ProgressPercent: Integer) of object;
nimm eine TFileCopyCallback = reference to procedure(ProgressPercent: Integer);
(optional, weil flexibler)
Wenn du das hast, dann kannst du diese Kopieraktion vom
http://www.delphipraxis.net/185335-b...ab-xe2%5D.html aus starten und alles wird gut.
Delphi-Quellcode:
procedure TFoo.FileCopyWorker_DoWork(Sender: TObject; e: TDoWorkEventArgs );
var
FileCopyArg : TFileCopyArg;
begin
FileCopyArg := e.Argument.AsType<TFileCopyArg>;
MyCopyFile(
FileCopyArg.SourceName,
FileCopyArg.DestName,
FileCopyArg.FileCopyMode,
(Sender as TBackgroundWorker).ReportProgress );
end;
procedure TFoo.FileCopyWorker_ProgressChanged( Sender : TObject; e: TProgressChangedEventArgs );
begin
ProgressBar1.Position := e.Value;
end;
procedure TFoo.FileCopyWorker_RunWorkerCompleted( Sender: TObject; e: TRunWorkerCompletedEventArgs );
begin
if Assigned( e.Error ) then
ShowMessage( e.Error.ToString() )
else if e.Cancelled then
ShowMessage( 'Du hast das abgebrochen!' )
else
ShowMessage( 'Ich habe fertig!' );
end;
Das ist eigentlich alles und du kannst die originale Routine verwenden.
PS Das Wichtigste hatte ich vergessen:
Du greifst immer wieder auf
SourceStream.Size
zu, und das macht deine Routine mit Progress-Callback
extremst langsam. Denn bei
jedem Aufruf wandert der Stream an das Ende liest die Position und kehrt zur vorherigen Position zurück!
Lies den Wert am Anfang
einmal aus und merk dir diesen, dann läuft auch die Routine mit dem Progress sehr schnell.