![]() |
CopyFileEx kopiert nicht
Hi,
ich will Dateien mit CopyFileEx kopieren (mit CopyFileEx da ich ProgressBars eingebaut habe). Jetzt meine Frage: Warum funktioniert das nicht (es kopiert die Dateien einfach nicht und liefert immer "False" zurück)? Ich habe den folgenden Code von ![]() Ich hoffe ihr könnt mir helfen ;) Standart Code:
Delphi-Quellcode:
Anwendung:
function PProgressRoutine(TotalFileSize,
TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall; begin if dwCallbackReason = CALLBACK_STREAM_SWITCH then TLMDBiProgressBar(lpData).Scale := TotalFileSize.QuadPart; TLMDBiProgressBar(lpData).DarkValue := TotalBytesTransferred.QuadPart; Application.ProcessMessages; Result := PROGRESS_CONTINUE; end; procedure ListCopyProgress(const Files: TStrings; aDestPath: String; TotalProgressBar, CurrentProgressBar: TLMDBiProgressBar); var x, y : integer; FCancelled: Boolean; begin FCancelled := False; x:=Files.Count; TotalProgressBar.MinValue := 0; TotalProgressBar.Scale := x; for y:=0 to x-1 do begin CopyFileEx(PChar(Files[y]), PChar(ExtractFileDir(aDestPath)+'\'+ExtractFileName(Files[y])), @PProgressRoutine, CurrentProgressBar, @FCancelled, 0); TotalProgressBar.DarkValue := y+1; TotalProgressBar.Update; CurrentProgressBar.Update; end; end;
Delphi-Quellcode:
Was geht hier schief?
ListCopyProgress(Dateien, edZielPfad.Text, pbGesamt, pbAktiveDatei);
Edit: TLMDBiProgressBar fast genauso wie TProgressBar nur bisschen verbessert; MinValue = TProgressBar.min Scale = TProgressBar.max DarkValue = TProgressBar.position Danke :) |
AW: CopyFileEx kopiert nicht
Aus der Hilfe:
Zitat:
Delphi-Quellcode:
gibst du als Ziel keinen Dateinamen an.
CopyFileEx(PChar(Files[y]), PChar(ExtractFileDir(aDestPath)+'\'+ExtractFileName(Files[y]))
|
AW: CopyFileEx kopiert nicht
Was soll ExtractFilename denn sonst zurückgeben? OK,
Zitat:
|
AW: CopyFileEx kopiert nicht
Mist. Das war ein Blackout. Ich nehme alles wieder zurück.
|
AW: CopyFileEx kopiert nicht
Das mit ExtractFilePath ausgebessert.
Klappt immer noch nicht - wie du gesagt hast^^ :x |
AW: CopyFileEx kopiert nicht
Speicher die Pfade mal in Variablen zwischen und guck dir deren Inhalt an. Und was sagt GetLastError, wenn CopyFileEx False zurückliefert?
|
AW: CopyFileEx kopiert nicht
Am Anfang warn es die Variablen (Pfade waren gleich) jetzt sind die Pfade unterschiedlich, aber es kommt immernoch ein Error (voher 32) und zwar "1235"...
Was bedeutet der ? PS: Ich fang schonma an zu googlen ;) Vielen Dank für die Hilfe bisher! Mfg, Destroxi |
AW: CopyFileEx kopiert nicht
der teil läuft ....
Delphi-Quellcode:
CopyFileEx(PChar(Files[y]), PChar(IncludeTrailingBackSlash(aDestPath)+ExtractFileName(Files[y])),
nil, nil, nil, 0); |
AW: CopyFileEx kopiert nicht
Code:
Und es wäre auch nicht ganz so dumm, eine Fehlerbehandlung in den Code einzubauen. Oder kannst du was damit anfangen, wenn dich der Kunde anruft und sagt: "Geht nicht", weil du keine Fehlermeldung ausgibst?
C:\Dokumente und Einstellungen\Michael>net helpmsg 32
Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird. C:\Dokumente und Einstellungen\Michael> |
AW: CopyFileEx kopiert nicht
Code:
Mhh... fragt sich bloß warum :|
C:\Dokumente und Einstellungen\Destroxi>net helpmsg 1235
Die Anforderung wurde abgebrochen Weiß da wer was? Zitat:
Mfg, Destroxi |
AW: CopyFileEx kopiert nicht
Kommt erst der Fehler mit dem Fehlercode 32 noch? Dann könnte 1235 bedeuten dass die Anforderung an die Callback-Funktion abgebrochen wird, was logisch wäre, da die Datei nicht kopiert werden kann.
|
AW: CopyFileEx kopiert nicht
Ne 32 kommt nicht mehr, 1235 auch nicht mehr, allerdings kommt ein "Access violation" Error wenn ich @PProgressRoutine als 3. Parameter rein nehme.
Was ist denn da falsch? Finde nichts...
Delphi-Quellcode:
Mfg, Destroxi
function PProgressRoutine(TotalFileSize,
TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall; var Prozent: Integer; begin try Prozent := Round(TLMDBiProgressBar(lpData).DarkValue / TLMDBiProgressBar(lpData).Scale * 100); except Prozent := 0; end; MainForm.laGesamt.Caption := 'Gesamt-Fortschritt ('+IntToStr(Prozent)+'%):'; if dwCallbackReason = CALLBACK_STREAM_SWITCH then TLMDBiProgressBar(lpData).Scale := TotalFileSize.QuadPart; TLMDBiProgressBar(lpData).DarkValue := TotalBytesTransferred.QuadPart; Application.ProcessMessages; Result := PROGRESS_CONTINUE; end; |
AW: CopyFileEx kopiert nicht
wenn ich FCancelled wie bei Dir als Prozedurvariable verwende kopiert er genau eine Datei, auch wenn ich die Variable bei jedem Loop setze. Lege ich sie außerhalb an läuft er durch.
Meine PProgressRoutine ist nur noch ein Rumpf von Deiner .... Irgendwas ist das am Rutschen ..... |
AW: CopyFileEx kopiert nicht
Liste der Anhänge anzeigen (Anzahl: 2)
Mein Problem ist ja dass ich nen Access Violation Error bekomme wenn ich statt
Code:
dies schreibe:
If not CopyFileEx(PChar(Files[y]), PChar(ExtractFilePath(aDestPath)+ExtractFileName(Files[y])),
nil, nil, FCancelled, 0) then
Delphi-Quellcode:
Ansonsten werd ich das mal probieren wenn kein Access Violation error mehr kommt ;)
If not CopyFileEx(PChar(Files[y]), PChar(ExtractFilePath(aDestPath)+ExtractFileName(Files[y])),
@PProgressRoutine, nil, FCancelled, 0) then Edit: Ja klar, "lpData" muss gesetzt werden; gesagt - getan - und schon klappts ;) Danke!!! Edit²: Für alle die die funktionierende Lösung wollen:
Delphi-Quellcode:
Und anwenden mit bsp:
function PProgressRoutine(TotalFileSize,
TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall; begin if dwCallbackReason = CALLBACK_STREAM_SWITCH then TLMDBiProgressBar(lpData).Scale := TotalFileSize.QuadPart; TLMDBiProgressBar(lpData).DarkValue := TotalBytesTransferred.QuadPart; Application.ProcessMessages; Result := PROGRESS_CONTINUE; end; procedure ListCopyProgress(const Files: TStrings; aDestPath: String; TotalProgressBar, CurrentProgressBar: TLMDBiProgressBar); var x, y, Prozent: integer; begin x:=Files.Count; TotalProgressBar.MinValue := 0; TotalProgressBar.Scale := x; for y:=0 to x-1 do begin MainForm.laAktiveDatei.Caption := 'Aktuelle Datei: '+ExtractFileName(Files[y]); try Prozent := Round(TotalProgressBar.DarkValue / TotalProgressBar.Scale * 100); except Prozent := 0; end; MainForm.laGesamt.Caption := 'Gesamt-Fortschritt ('+IntToStr(Prozent)+'%):'; If not CopyFileEx(PChar(Files[y]), PChar(ExtractFilePath(aDestPath)+ExtractFileName(Files[y])), @PProgressRoutine, MainForm.pbAktiveDatei, FCancelled, 0) then begin ShowMessage('File['+IntToStr(y)+']: '+Files[y]+#10+ 'DestFile['+IntToStr(y)+']: '+ExtractFilePath(aDestPath)+ExtractFileName(Files[y])+#10+ 'Error: '+IntToStr(GetLastError)); end; TotalProgressBar.DarkValue := y+1; TotalProgressBar.Update; CurrentProgressBar.Update; end; MainForm.laAktiveDatei.Caption := 'Aktuelle Datei: Keine'; MainForm.laGesamt.Caption := 'Gesamt-Fortschritt (100%):'; end;
Delphi-Quellcode:
Und für alle, die es immer noch nicht verstehen gibts im Anhang nen kleines Beispiel-Programm mit Quellcode ;)
ListCopyProgress(DateienStringList, 'C:\ZielPfad\', ProgressBarAlleDateien, ProgressBarAktiveDatei);
PS: Um dieses Programm nutzen zu können benötigt ihr die ![]() Mfg, Destroxi |
AW: CopyFileEx kopiert nicht
Zitat:
![]() |
AW: CopyFileEx kopiert nicht
Zitat:
Aber Danke :D Mfg, Destroxi |
AW: CopyFileEx kopiert nicht
Nur für den Fall der Fälle - der Beitrag ist ja noch nicht sooo alt und manch einer kommt über Google und kopiert die Routinen hier raus:
Destroxi hat FCancelled als Boolean definiert. Da kann man in eine Falle tappen: ![]() |
AW: CopyFileEx kopiert nicht
Bei der Variable meinst du bestimmt BOOL oder LongBool (anstatt PBOOL). :D
|
AW: CopyFileEx kopiert nicht
So isses ...
Und wenn du mir jetzt noch sagst, warum MainForm.pbAktiveDatei nicht als @MainForm.pbAktiveDatei übergeben wird, obwohl doch ein Pointer gefordert ist... |
AW: CopyFileEx kopiert nicht
Weil ein Objektzeiger im Prinzip schon ein Pointer ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 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 by Thomas Breitkreuz