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
 
changlee
(Gast)

n/a Beiträge
 
#20

AW: Datei kopieren mit Fortschrittsanzeige

  Alt 19. Aug 2019, 21:34
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?
  Mit Zitat antworten Zitat
 


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 12:42 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