Einzelnen Beitrag anzeigen

changlee
(Gast)

n/a Beiträge
 
#17

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