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
tomkupitz

Registriert seit: 26. Jan 2011
351 Beiträge
 
Delphi 12 Athens
 
#1

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 19. Aug 2019, 23:20
Windows.CopyFileEx geht auch...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 00:07
Haben noch andere Prozesse einen Zugriff auf die Datei(en), wie zum Beispiel ein Virenscanner?

Und da andere noch nicht von dem Problem berichtet haben, scheint es üblicherweise nicht aufzutreten. Zu mal du mit dem alternativen Code ja gezeigt hast, dass es nicht an der Implementierung liegt, sondern irgend was bei dir das Schließen der Datei verzögert/blockiert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.683 Beiträge
 
Delphi 5 Professional
 
#3

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 20. Aug 2019, 00:31
Man sollte beachten, dass das Lesen von Dateien unter Umständen sehr viel schneller geht als das Schreiben, beispielsweise beim Kopieren von Daten von SSD auf HDD oder von HDD/SSD auf Netzwerk. Windows liest den Kram in den Cache so schnell es die Quelle zulässt, aber das Schließen der Datei kann logischerweise erst abgeschlossen werden, nachdem die Daten auch ans Ziel rausgeschrieben wurden.

Grüße
Dalai
  Mit Zitat antworten Zitat
changlee
(Gast)

n/a Beiträge
 
#4

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.679 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

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
 
#6

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
 
#7

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
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 02:03 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