Also deine FileCopy-Routine ist echt grausam ... wer hat die denn verbrochen?
Dieser Verbrecher antwortet gerade
Ich freue mich immer sehr, wenn Verbesserungsvorschläge dazu beitragen, etwas "zu verbessern". Darum habe ich mir deine Vorschläge mal zur Brust genommen:
[*]Statt einem String
als Rückgabe verwende Exceptions
Mittlerweile kenne ich deinen Standpunkt zur
Exception-Behandlung, aber in diesem Fall bringen mir Exceptions
anstelle des String-Rückgabewertes (und so hast du das wohl gemeint) überhaupt nicht weiter. Welche
Exception soll beispielsweise geworfen werden, wenn die Zieldatei neuer ist? Da ist meiner Meinung nach ein schlichter Rückgabewert geeigneter. Der User soll ja
bei Bedarf lediglich darüber informiert werden, was los ist.
[*]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;
Gerade um das "richtig machen geht es hier. Diese
Exception wird im Normalfall nur im Entwicklungsmodus stattfinden. Der User wird diese niemals zu Gesicht bekommen, denn wenn das passiert, hat der Programmierer bereits Bockmist gebaut und sein Werk nicht mal ansatzweise getestet.
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.
Das mit dem Getter der Filesize habe ich nicht gewusst. Aber, ich habe es jetzt mal geändert (bin ja nicht beratungsresistent) und mit einer 3,5 GB großen Datei ausprobiert und die Zeiten verglichen. Die Formulierung "
extremst langsam" ist total überzogen. Der Unterschied liegt bei dieser 3,5 GB-Datei im Bereich von einigen Millisekunden.
Wenn also Performance raus zu holen ist, dann nicht an dieser Stelle.