Es ist eine Kopie von hier umgeschrieben zu 64bit
https://stackoverflow.com/questions/...fast-file-copy
Ich nutze diese Funktion statt TFile.Copy weil ich der Meinung bin mehr Kontrolle zu haben.
Wie benutzt man TFile.Copy richtig, um auch auf Abbruchereignisse zu reagieren?
Ich habs mal so versucht aber das mit dem CallBack funktioniert nicht so richtig. Ich würde gerne auf die Variable die Anzahl Bytes hinzuaddieren, die pro Durchlauf dazukommen
Mit der Funktion oben kopiere ich immer in 50MB-Schritten und kann so auch immer schön 50MB auf die Variable hinzuaddieren.
Delphi-Quellcode:
Winapi.Windows.CopyFileEx(PWideChar(Source), PWideChar(Dest), @CopyCallback,
nil, @Cancel, 0);
function CopyCallback(TotalFileSize, TotalBytesCopied, StreamSize, StreamBytesTransferred: Int64; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle)
: DWORD;
stdcall;
var
CanContinue: Boolean;
const
PROCESS_CONTINUE = 0;
begin
CanContinue :=
not Cancel;
Result := PROCESS_CONTINUE;
if dwCallbackReason = CALLBACK_CHUNK_FINISHED
then
begin
if CanContinue
then
begin
// Auf die Variable BytesCopied möchte ich hinzuaddieren, wieviele Bytes pro Durchlauf kopiert wurden
end;
end;
end;
Eine Idee wäre,
BytesCopiedTemp := BytesCopied - StreamBytesTransferred;
. In BytesCopiedTemp steht in meinem Fall jetzt durchgehend 1 MB, den ich auf BytesCopied hinzuaddieren kann. Aber so richtig scheint das bei mehreren Dateien auch nicht zu funktionieren, denn BytesCopied geht bei jeder Datei auf 0 zurück wenn mehr als eine Datei kopiert werden soll.
Delphi-Quellcode:
if CanContinue then
begin
BytesCopiedTmp := BytesCopied - StreamBytesTransferred;
Inc(BytesCopied, BytesCopiedTmp);
end;
Kann mir da jemand helfen? Auf BytesCopied möchte ich immer die Größe des aktuell kopierten Chunks addieren. Aber 2 Dateien ist BytesCopiedTmp aber so groß wie ein PB und spinnt kurz herum.