![]() |
AW: Systemfehlercode 6 beim Kopieren von Dateien
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:
Und dazu schrieb ich:
// 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; 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:
Es ist also eher ein Mathe-Problem hoffe ich.
if CanContinue then
begin BytesCopiedTmp := BytesCopied - StreamBytesTransferred; Inc(BytesCopied, BytesCopiedTmp); end; 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. |
AW: Systemfehlercode 6 beim Kopieren von Dateien
Keiner? :pale:
|
AW: Systemfehlercode 6 beim Kopieren von Dateien
Ok also ich verstehe es richtig, es geht jetzt mittlerweile um etwas ganz anderes, nämlich "Wie verfolge ich den Gesamtfortschritt wenn ich parallel mittels CopyFileEx mehrere Dateien kopiere, alle aber natürlich den gleichen Callback aufrufen?", richtig?
Ich hätte 2 Ideen:
|
AW: Systemfehlercode 6 beim Kopieren von Dateien
Zitat:
2 Dateien sollen kopiert werden. Die erste 1 GB, die zweite 2 GB. Im CopyFileEx steht
Delphi-Quellcode:
Bei der ersten Datei sieht man in der Caption, wie BytesCopied bis 1 GB hochgeht. BytesCopiedTmp ist durchgehend 1 MB (der Chunk).
Caption := BytesCopied.ToString + ' - ' + BytesCopiedTmp.ToString;
Wird angefangen die Zweite Datei zu kopieren, fängt BytesCopied wieder bei 0 an statt bei 1GB weiterzumachen. |
AW: Systemfehlercode 6 beim Kopieren von Dateien
Ist doch auch logisch, die beiden Operationen haben nichts miteinander zu tun.
Wenn du es sowieso strikt nacheinander machst kannst du doch den Wert einfach aufaddieren. Verstehe das Problem dahinter ehrlich gesagt nicht. (Und weshalb sollte es nicht funktionieren zwei Dateien parallel zu kopieren?) |
AW: Systemfehlercode 6 beim Kopieren von Dateien
Zitat:
Delphi-Quellcode:
if CanContinue then
begin BytesCopiedTmp := BytesCopied - StreamBytesTransferred; Inc(BytesCopied, BytesCopiedTmp); Caption := BytesCopied.ToString + ' - ' + BytesCopiedTmp.ToString; end; |
AW: Systemfehlercode 6 beim Kopieren von Dateien
Du musst dir den Wert über den Aufruf des Callbacks hinaus merken. Du brauchst ein Feld in deinem Formular oder wo auch immer du das speichern möchtest, keine lokale Variable.
|
AW: Systemfehlercode 6 beim Kopieren von Dateien
BytesCopied und BytesCopiedTmp sind global.
Ich glaube ich habs
Delphi-Quellcode:
// BytesCopied und BytesCopiedTmp sind global
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 Inc(BytesCopied, StreamBytesTransferred - BytesCopiedTmp); BytesCopiedTmp := StreamBytesTransferred; end; end; end; procedure Kopiere; begin BytesCopiedTmp := 0; Winapi.Windows.CopyFileEx(quelle, ziel), @CopyCallback, nil, @Cancel, 0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz