AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit CopyFileEx

Ein Thema von Paul0703 · begonnen am 27. Sep 2008 · letzter Beitrag vom 27. Sep 2008
Antwort Antwort
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#1

Problem mit CopyFileEx

  Alt 27. Sep 2008, 18:57
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
Wenn die Datei mehrere 100 MB groß ist, dann passiert gar nichts
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
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 19:10
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
Ralf Kaiser
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#3

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 19:15
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

Ich setze mal Breakpoints und probiere nochmal eine andere Datei.
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#4

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 19:31
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 ?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 19:35
Es gibt so eine tolle Erfindung namens Rückgabewert. Lass dir den mal anzeigen und, falls er False ist, zusätzlich SysErrorMessage(GetLastError).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 19:37
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
Ralf Kaiser
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#7

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 19:39
Problem schon gelöst

Auf dem Ziellaufwerk war nicht genug Speicherplatz frei
*aufdenkopfhau*

Trotzdem danke für eure Hilfe!

Paul
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 20:59
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;
  Mit Zitat antworten Zitat
Paul0703

Registriert seit: 24. Sep 2008
Ort: Halle(Saale)
138 Beiträge
 
Delphi 7 Professional
 
#9

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 21:14
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!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Problem mit CopyFileEx

  Alt 27. Sep 2008, 22:46
Zitat von Paul0703:
Problem schon gelöst

Auf dem Ziellaufwerk war nicht genug Speicherplatz frei
*aufdenkopfhau*

Trotzdem danke für eure Hilfe!

Paul
Und genau das hättest du erfahren, wenn du den Rückgabewert ausgewertet hättest.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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