AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Datei kopieren mit Fortschrittsanzeige
Thema durchsuchen
Ansicht
Themen-Optionen

Datei kopieren mit Fortschrittsanzeige

Ein Thema von Matze · begonnen am 15. Feb 2004 · letzter Beitrag vom 20. Aug 2019
Antwort Antwort
Seite 3 von 3     123   
changlee
(Gast)

n/a Beiträge
 
#21

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 07:15
Windows.CopyFileEx geht auch...
...ermöglicht aber leider keine Fortschrittsanzeige.


Zu den Hinweisen von Luckie und Dalai, habe ich ein paar Tests gemacht.

Das Problem tritt auf beim Schreiben auf externe HDDs (schreibend auf USB2.0/USB3.0, lesend von USB2.0/USB3.0/interne SSD).
Das Problem tritt nicht auf beim Schreiben auf die interne SSD (schreibend auf interne SSD, lesend von USB2.0/USB3.0/interne SSD).-> liegt also offenbar nicht am Virenscanner

Leider habe ich keine externe SSD und keine interne HDD zum Testen.

Die Zeit für Closefile beträgt nach groben Abschätzen bei den Versuchen ca. ein Drittel der Kopierdauer für die ganze Datei - sofern auf eine HDD geschrieben wird.
Bei einer SSD benötigt Closefile keine spürbare Zeit, selbst bei sehr großen Dateien nicht.

Fallen euch noch irgendwelche Ansatzpunkte ein?
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#22

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 08:09
Windows.CopyFileEx geht auch...
...ermöglicht aber leider keine Fortschrittsanzeige.
Doch, es erlaubt genau das:

CopyFileWithProgress (using CopyFileEx)

Benutze ich schon seit Jahren problemlos.
Thomas Mueller
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#23

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 18:42
ok danke. Das hatte ich anders in Erinnerung.
Ich will es gerade testen, habe aber noch ein Problem mit dem Aufruf von CopyFileEx.
Der Beispielcode ist mir zugegebener Maßen zu umfangreich. Ich versuche ein Minimalbeispiel umzusetzen:

Code:
function TJobThread.SyncProgress2(_TotalFileSize, _TotalBytesTransferred, _StreamSize, _StreamBytesTransferred: LARGE_INTEGER; _StreamNumber, _CallbackReason: LongWord; _SourceFile, _DestinationFile: THandle; _Data: Pointer): LongWord;
begin
  // mach irgendwas..
end;

procedure TJobThread.Execute;
var
  src1,tgt:string;
begin
    src := 'c:\temp\datei1.img';
    tgt := 'c:\temp\datei2.img';
    Windows.CopyFileEx(PChar(src), PChar(tgt), SyncProgress2, Redir, @Redir.FCancelFlag, Flags); // Fehler beim Compilieren: E2035 Nicht genügend wirkliche Parameter
    Windows.CopyFileEx(PChar(src), PChar(tgt), @SyncProgress2, Redir, @Redir.FCancelFlag, Flags); // Fehler beim Compilieren: E2036 Variable erforderlich
end;
Wie kann ich die Funktion SyncProgress2 übergeben?


Falls noch jemand eine Idee hat warum closfile bzw. Stream.Free so lange dauert, bin ich aber auch da noch für jeden Tip dankbar.

Geändert von changlee (20. Aug 2019 um 18:53 Uhr)
  Mit Zitat antworten Zitat
Forensiker
(Gast)

n/a Beiträge
 
#24

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 18:58
SyncProgress2 ist eine callback und sollte Global definiert sein.. nicht innerhalb einer Klasse.
Windows.CopyFileEx(PChar(src), PChar(tgt), SyncProgress2, Redir, @Redir.FCancelFlag, Flags); // Fehler beim Compilieren: E2035 Nicht genügend wirkliche Parameter
Kann nicht funktionieren da ein Pointer auf die Callback erwartet wird.
Windows.CopyFileEx(PChar(src), PChar(tgt), @SyncProgress2, Redir, @Redir.FCancelFlag, Flags); // Fehler beim Compilieren: E2036 Variable erforderlich
Siehe erste Zeile im Beitrag.

Geändert von Forensiker (20. Aug 2019 um 19:25 Uhr)
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#25

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 19:40
ich hab's befürchtet. Ich kann wirklich keine Klassenmethode übergeben??

Dann kapiere ich es aber immer noch nicht.
Ich habe jezt folgenden Code:

Code:
procedure TJobThread.SyncProgress(Position, Size: int64);
begin
  self.fProgressPosition := Position;
  self.fProgressSize     := Size;
  self.fProgressToPublish := 0;
  self.Synchronize(self.publishProgress);
end;

function SyncProgress2(_TotalFileSize, _TotalBytesTransferred, _StreamSize, _StreamBytesTransferred: LARGE_INTEGER; _StreamNumber, _CallbackReason: LongWord; _SourceFile, _DestinationFile: THandle; _Data: Pointer): LongWord;
var a,b:int64;
begin
  //a := int64(_TotalBytesTransferred);
  //b := int64(_TotalFileSize);
  //TJobThread(_Data).SyncProgress(a,b);
  result := PROGRESS_CONTINUE;
end;


procedure TJobThread.Execute;
var
  doCancel : PBOOL;
  src,tgt:string;
begin
  src := 'c:\temp\datei1.img';
  tgt := 'c:\temp\datei2.img';
  doCancel := PBOOL(False);
  Windows.CopyFileEx(PChar(s1), PChar(s2), @SyncProgress2, @self, doCancel, 0) then begin
end;
Die Zieldatei wird erstellt, enthält aber keine Daten. Der Kopiervorgang ist sofort zu Ende und die Datei nicht zu öffnen.
Setze ich einen Haltepunkt bekomme ich beim Aufruf von CopyFileEx eine Zugriffsverletzung (Lesen von Adresse...).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 20:08
http://michael-puff.de/Programmierun...pyFileEx.shtml
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#27

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 20:35
Den Code hatte ich auch schon gefunden

Aber trotzdem gut, dass du ihn nochmal geschickt hast.
Ich habe meine beiden Fehler gefunden:

Code:
function SyncProgress2(...): LongWord; // ALT, Kopiervorgang schlägt fehl
function SyncProgress2(...): DWORD; stdcall; // NEU, Kopiervorgang funktionert
...
TJobThread(_Data).SyncProgress(a,b); // Falsch
TJobThread(_Data^).SyncProgress(a,b); // Korrekt
Danke!!!

Viele Grüße
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 23:13
Ok, dann findet man die Quellcodes auf meiner Seite also noch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 16:16 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