![]() |
Problem mit CopyFileEx
Hallo,
ich habe jetzt mal versucht, eine Datei zu kopieren und den Fortschritt in einer ProgressBar anzeigen zu lassen. Das funktioniert auch, aber nur mit kleinen Dateien :mrgreen: Wenn die Datei mehrere 100 MB groß ist, dann passiert gar nichts :wall: Hier der Code:
Delphi-Quellcode:
Bin dankbar für Hilfe!
function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize,
StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, lpData: DWORD): DWORD; stdcall; begin Application.ProcessMessages; if CancelCopy = True then begin ShowMessage('Abbruch'); result := PROGRESS_CANCEL; Form1.ProgressBar1.Position := 0; Exit; end else Application.ProcessMessages; case dwCallbackReason of CALLBACK_CHUNK_FINISHED: begin Form1.ProgressBar1.Position := TotalBytesTransferred.QuadPart; result := PROGRESS_CONTINUE; end; CALLBACK_STREAM_SWITCH: begin Form1.ProgressBar1.Max := TotalFileSize.QuadPart; result := PROGRESS_CONTINUE; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var Cancel: PBOOL; begin CancelCopy := False; Cancel := nil; CopyFileEx('C:\aaa.exe', 'D:\aaa.exe', @CopyFileProgress, nil, Cancel, 0); Form1.ProgressBar1.Position := 0; end; procedure TForm1.Button2Click(Sender: TObject); begin CancelCopy := True; end; end. Paul |
Re: Problem mit CopyFileEx
Hallo,
ich hab diesen (und GENAU diesen) Code gerade mit einer 1.5GB großen Datei ausprobiert. Er funktioniert ohne Probleme! Hast du mal Breakpoints vor und hinter das Kopieren gesetzt? Ciao, Ralf |
Re: Problem mit CopyFileEx
Zitat:
Ich setze mal Breakpoints und probiere nochmal eine andere Datei. |
Re: Problem mit CopyFileEx
Es funktioniert immer noch nicht!
Und bei einer kleinen Datei habe ich gesehen durch die Breakpoints, dass er eine Weile auf CopyFileEx bleibt und dann weiter geht. Aber bei einer großen Datei, die nicht funktioniert, bleibt er nur ganz kurz auf CopyFileEx. Aber woran liegt das, wenn der Code bei dir geht, Alfi001 ? |
Re: Problem mit CopyFileEx
Es gibt so eine tolle Erfindung namens Rückgabewert. :mrgreen: Lass dir den mal anzeigen und, falls er False ist, zusätzlich SysErrorMessage(GetLastError).
|
Re: Problem mit CopyFileEx
Zitat:
An deinem Code habe ich nichts verändert. Seltsam. Ciao, Ralf |
Re: Problem mit CopyFileEx
Problem schon gelöst :wall:
Auf dem Ziellaufwerk war nicht genug Speicherplatz frei :oops: *aufdenkopfhau* Trotzdem danke für eure Hilfe! Paul |
Re: Problem mit CopyFileEx
Hier eine kleine Verbesserung: der Parameter lpData wird benützt um sich vom Formular unabhängig zu machen.
Delphi-Quellcode:
function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize,
StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, lpData: DWORD): DWORD; stdcall; var pb : TProgressBar; begin pb := TProgressBar(lpdata); // <=== Application.ProcessMessages; if CancelCopy then begin ShowMessage('Abbruch'); result := PROGRESS_CANCEL; pb.Position := 0; Exit; end else Application.ProcessMessages; case dwCallbackReason of CALLBACK_CHUNK_FINISHED: begin pb.Position := TotalBytesTransferred.QuadPart; result := PROGRESS_CONTINUE; end; CALLBACK_STREAM_SWITCH: begin pb.Max := TotalFileSize.QuadPart; result := PROGRESS_CONTINUE; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var Cancel: PBOOL; begin CancelCopy := False; Cancel := nil; CopyFileEx('C:\aaa.exe', 'D:\aaa.exe', @CopyFileProgress, Pointer(ProgressBar1), Cancel, 0); ProgressBar1.Position := 0; end; |
Re: Problem mit CopyFileEx
Zitat:
|
Re: Problem mit CopyFileEx
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 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