Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei kopieren mit Fortschrittsanzeige (https://www.delphipraxis.net/16354-datei-kopieren-mit-fortschrittsanzeige.html)

APP 16. Feb 2004 08:56

Re: Datei kopieren mit Fortschrittsanzeige
 
Hallo Matze,

Zitat:

Zitat von Matze
Das geht irgendwie nicht, was muss ich denn genau anstelle von aFlags schreiben? In sakuras Post finde ich darüber nichts.

Abgesehen vom Flags/aFlags-Problem, das Dir Chris gelöst hat, funktioniert Sakuras Lösung einwandfrei:

Delphi-Quellcode:
    ...
    end; // target not available
    fFlags := Flags // statt aFlags;
    ...
Aufruf (aus Sakuras Post)
Code:
DoFileWork(Self.Handle, FO_DELETE, strlFiles, nil, [b][color=red]FOF_ALLOWUNDO[/color][/b]);

Mögliche Parameter für Flag (aus Sakuras Post)
Zitat:

aFlags - mögliche Flags zur Verarbeitung
FOF_ALLOWUNDO - Ermöglicht eine Umkehrung der letzten Operation
FOF_FILESONLY - Verzeichnisse ignorieren
FOF_MULTIDESTFILES - aTo hat einen Eintrag für jeden Eintrag in der aFrom Liste
FOF_NOCONFIRMATION - Der User muss keine Bestätigung zum Überschreiben, etc. geben
FOF_NOERRORUI - Fehlermeldugen unterdrücken
FOF_NORECURSION - Unterverzeichnisse ignorieren
FOF_RENAMEONCOLLISION - Datei umbenennen, wenn diese bereits im Zielverzeichnis existiert (Kopie 1 von ...)
FOF_SILENT - Fortschrittsanzeige unterdrücken.

Matze 16. Feb 2004 11:57

Re: Datei kopieren mit Fortschrittsanzeige
 
Boah, ich bin platt!

Ich staune jedesmal neu.

Vielen Dank euch allen! :)

Matze 16. Feb 2004 12:20

Re: Datei kopieren mit Fortschrittsanzeige
 
Also, sakuras Code geht schon mal. :)

Bei dem anderen kommt an dieser Stelle:

Delphi-Quellcode:
Assign(infile, InFileName);
dieser Fehler:

Zitat:

[Fehler] Unit1.pas(475): Inkompatible Typen: 'TPersistent' und 'file'
infile ist vom Typ file
InFileName von Typ string

Was mache ich denn nun schon wieder falsch?

In der OH sind immer nur andere Beispiele zu finden. :gruebel:

CalganX 16. Feb 2004 12:25

Re: Datei kopieren mit Fortschrittsanzeige
 
Hi,
mach aus den ganzen Assigns mal AssignFile...

Chris

Matze 16. Feb 2004 12:27

Re: Datei kopieren mit Fortschrittsanzeige
 
Thx, geht! :thumb:

APP 16. Feb 2004 12:35

Re: Datei kopieren mit Fortschrittsanzeige
 
Komisch,
bei mir geht es auch mit Assign...

changlee 19. Aug 2019 21:34

AW: Datei kopieren mit Fortschrittsanzeige
 
Der Beitrag ist zwar schon sehr alt, aber ich habe ein Problem damit und ich wundere mich, dass niemand anderes dieses Problem bemerkt:

Wenn ich Dateien mit dieser Funktion in einer Schleife kopiere, dann läuft mein Statusbalken gleichmäßig voll, verharrt dann aber relativ lange an seiner letzten Position bis er mit der nächsten Datei fortfährt. Und der Grund dafür ist die Zeile:
Code:
CloseFile(outfile)
CloseFile dauert relativ lange (nennenswert lange im Vergleich zur Gesamtdauer des Kopiervorgangs).
Das ist sehr schade, da die Funktion dadurch unbrauchbar wird.

Ich habe dann das ganze auch nochmal mit Streams geschrieben, aber ich sehe das gleiche Verhalten - nur diesmal in der Zeile:
Code:
outStream.Free; // das hier dauert sehr lange!!!
gesamter Code der Stream-Variante:

Code:
function FastFileCopy2(const InFileName, OutFileName: string; CallBack: TProgressCallBack; doneBefore: int64; total: int64; mustCancel: TBoolFunction): boolean;
const
  BufSize = 3 * 4 * 4096; { 48Kbytes gives me the best results }
var
  done, thisSize: int64;
  outStream,inStream:TFileStream;
begin
  result := false;
  if (InFileName <> OutFileName) then begin
    outStream := TFileStream.Create(OutFileName, fmCreate);
    inStream := TFileStream.Create(InFileName, fmOpenRead);
    try
      thisSize := inStream.Size;
      if total = 0 then begin
        total := thisSize;
        doneBefore := 0;
      end;
      while (inStream.Position+BufSize<=thisSize) and not mustCancel do begin
        outStream.CopyFrom(inStream,BufSize);
        CallBack(inStream.Position+doneBefore,total);
      end;
      if not MustCancel then begin
        outStream.CopyFrom(inStream,inStream.Size-inStream.Position);
        CallBack(inStream.Position+doneBefore,total);
        //FileSetDate(TFileRec(outfile).Handle, FileGetDate(TFileRec(infile).Handle));
        result := true;
      end
    finally
      outStream.Free; // das hier dauert sehr lange!!!
      inStream.Free;
    end;
  end;
end; {FastFileCopy2}
Warum ist das so? Kann ich irgendwie entgegenwirken?

tomkupitz 19. Aug 2019 23:20

AW: Datei kopieren mit Fortschrittsanzeige
 
Windows.CopyFileEx geht auch...

Luckie 20. Aug 2019 00:07

AW: Datei kopieren mit Fortschrittsanzeige
 
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.

Dalai 20. Aug 2019 00:31

AW: Datei kopieren mit Fortschrittsanzeige
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr.
Seite 2 von 3     12 3      

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