Einzelnen Beitrag anzeigen

DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#11

AW: Systemfehlercode 6 beim Kopieren von Dateien

  Alt 2. Nov 2019, 16:00
Der Block-basierte Code funktioniert. Der ist aber eh von Windows abhängig und deswegen möchte ich gerne auf die Windowseigenen Mittel zurückgreifen denn ich denke das Memory-Managment ist da besser.

Delphi-Quellcode:
// Der einfachste Fall: stellt euch eine Stringliste vor wo 2 Pfade drin stehen. Diese Dateien sollen kopiert werden. Es sind jeweils mindestens 2 GB, damit man den Fortschritt auch sieht.

// Magie hier, Magie dort... man geht mit einer Schleife durch die Liste und pro Pfad ruft man auf
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;
Und dazu schrieb ich:
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;
Es ist also eher ein Mathe-Problem hoffe ich.
BytesCopied: eine Variable, die alle bereits kopierten Bytes in Zahlform enthält. Die wird hochgezählt.
Man könnte natürlich einfach die Datei kopieren und bei Erfolg direkt die gesamte Dateigröße draufaddieren aber das passt nicht zum Konzept meines Programmes.
  Mit Zitat antworten Zitat