Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit CopyFileEx (https://www.delphipraxis.net/121442-problem-mit-copyfileex.html)

Paul0703 27. Sep 2008 18:57


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:
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.
Bin dankbar für Hilfe!

Paul

Ralf Kaiser 27. Sep 2008 19:10

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

Paul0703 27. Sep 2008 19:15

Re: Problem mit CopyFileEx
 
Zitat:

Zitat von Alfi001
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

Dann mache ich was falsch :mrgreen:

Ich setze mal Breakpoints und probiere nochmal eine andere Datei.

Paul0703 27. Sep 2008 19:31

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 ?

Apollonius 27. Sep 2008 19:35

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).

Ralf Kaiser 27. Sep 2008 19:37

Re: Problem mit CopyFileEx
 
Zitat:

Zitat von Paul0703
Aber woran liegt das, wenn der Code bei dir geht, Alfi001 ?

Das kann ich auch nicht sagen. Ich hab einfach nur eine neue Anwendung erzeugt, 2 Buttons und eine ProgressBar aufs Formular gelegt, deinen Code in die Eventhandler kopiert und die Dateinamen geändert sodass sie sich auf eine Datei auf meiner Platte beziehen. Dann hab ich das Programm gestartet und nach einem Klick auf "Button1" fing die Progressbar an hochzuzählen (dauerte eine Weile da die Quelldatei 1.5GB groß war)

An deinem Code habe ich nichts verändert.

Seltsam.

Ciao,
Ralf

Paul0703 27. Sep 2008 19:39

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

sx2008 27. Sep 2008 20:59

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;

Paul0703 27. Sep 2008 21:14

Re: Problem mit CopyFileEx
 
Zitat:

Zitat von sx2008
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;

Danke für den Tip! :thumb:

Luckie 27. Sep 2008 22:46

Re: Problem mit CopyFileEx
 
Zitat:

Zitat von Paul0703
Problem schon gelöst :wall:

Auf dem Ziellaufwerk war nicht genug Speicherplatz frei :oops:
*aufdenkopfhau*

Trotzdem danke für eure Hilfe!

Paul

Und genau das hättest du erfahren, wenn du den Rückgabewert ausgewertet hättest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz