Re: Datei kopieren mit Fortschrittsanzeige
Hallo Matze,
Zitat:
Delphi-Quellcode:
Aufruf (aus Sakuras Post)
...
end; // target not available fFlags := Flags // statt aFlags; ...
Code:
DoFileWork(Self.Handle, FO_DELETE, strlFiles, nil, [b][color=red]FOF_ALLOWUNDO[/color][/b]);
Mögliche Parameter für Flag (aus Sakuras Post) Zitat:
|
Re: Datei kopieren mit Fortschrittsanzeige
Boah, ich bin platt!
Ich staune jedesmal neu. Vielen Dank euch allen! :) |
Re: Datei kopieren mit Fortschrittsanzeige
Also, sakuras Code geht schon mal. :)
Bei dem anderen kommt an dieser Stelle:
Delphi-Quellcode:
dieser Fehler:
Assign(infile, InFileName);
Zitat:
InFileName von Typ string Was mache ich denn nun schon wieder falsch? In der OH sind immer nur andere Beispiele zu finden. :gruebel: |
Re: Datei kopieren mit Fortschrittsanzeige
Hi,
mach aus den ganzen Assigns mal AssignFile... Chris |
Re: Datei kopieren mit Fortschrittsanzeige
Thx, geht! :thumb:
|
Re: Datei kopieren mit Fortschrittsanzeige
Komisch,
bei mir geht es auch mit Assign... |
AW: Datei kopieren mit Fortschrittsanzeige
Der Beitrag ist zwar schon sehr alt, aber ich habe ein Problem damit und ich wundere mich, dass niemand anderes dieses Problem bemerkt:
Wenn ich Dateien mit dieser Funktion in einer Schleife kopiere, dann läuft mein Statusbalken gleichmäßig voll, verharrt dann aber relativ lange an seiner letzten Position bis er mit der nächsten Datei fortfährt. Und der Grund dafür ist die Zeile:
Code:
CloseFile dauert relativ lange (nennenswert lange im Vergleich zur Gesamtdauer des Kopiervorgangs).
CloseFile(outfile)
Das ist sehr schade, da die Funktion dadurch unbrauchbar wird. Ich habe dann das ganze auch nochmal mit Streams geschrieben, aber ich sehe das gleiche Verhalten - nur diesmal in der Zeile:
Code:
gesamter Code der Stream-Variante:
outStream.Free; // das hier dauert sehr lange!!!
Code:
Warum ist das so? Kann ich irgendwie entgegenwirken?
function FastFileCopy2(const InFileName, OutFileName: string; CallBack: TProgressCallBack; doneBefore: int64; total: int64; mustCancel: TBoolFunction): boolean;
const BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results } var done, thisSize: int64; outStream,inStream:TFileStream; begin result := false; if (InFileName <> OutFileName) then begin outStream := TFileStream.Create(OutFileName, fmCreate); inStream := TFileStream.Create(InFileName, fmOpenRead); try thisSize := inStream.Size; if total = 0 then begin total := thisSize; doneBefore := 0; end; while (inStream.Position+BufSize<=thisSize) and not mustCancel do begin outStream.CopyFrom(inStream,BufSize); CallBack(inStream.Position+doneBefore,total); end; if not MustCancel then begin outStream.CopyFrom(inStream,inStream.Size-inStream.Position); CallBack(inStream.Position+doneBefore,total); //FileSetDate(TFileRec(outfile).Handle, FileGetDate(TFileRec(infile).Handle)); result := true; end finally outStream.Free; // das hier dauert sehr lange!!! inStream.Free; end; end; end; {FastFileCopy2} |
AW: Datei kopieren mit Fortschrittsanzeige
Windows.CopyFileEx geht auch...
|
AW: Datei kopieren mit Fortschrittsanzeige
Haben noch andere Prozesse einen Zugriff auf die Datei(en), wie zum Beispiel ein Virenscanner?
Und da andere noch nicht von dem Problem berichtet haben, scheint es üblicherweise nicht aufzutreten. Zu mal du mit dem alternativen Code ja gezeigt hast, dass es nicht an der Implementierung liegt, sondern irgend was bei dir das Schließen der Datei verzögert/blockiert. |
AW: Datei kopieren mit Fortschrittsanzeige
Man sollte beachten, dass das Lesen von Dateien unter Umständen sehr viel schneller geht als das Schreiben, beispielsweise beim Kopieren von Daten von SSD auf HDD oder von HDD/SSD auf Netzwerk. Windows liest den Kram in den Cache so schnell es die Quelle zulässt, aber das Schließen der Datei kann logischerweise erst abgeschlossen werden, nachdem die Daten auch ans Ziel rausgeschrieben wurden.
Grüße Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz