Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#18

AW: VirtualStringTree - Nodes hinzufügen

  Alt 24. Mär 2014, 14:33
Delphi-Quellcode:
function getFileSizeA(const FileName: string): Int64;
var
 SR: TSearchRec;
begin
 Result := 0;

 if not FileExists(FileName) then
  Exit;

 if FindFirst(FileName, faAnyFile and not faDirectory, SR) = 0 then
  try
   Result := SR.Size;
  finally
   SysUtils.FindClose(SR)
  end;
end;
Das kannst du anders machen. Mal unabhängig davon ob es Sinn macht FindFirst für jede einzelne Datei FindFirst neu zu bemühen, sowie SR.Size maximal eine 32 Bit Größe ausgibt (also alles über 2 GByte falsch wiedergibt), womit Int64 unnötig ist, ist in Code FileExists nicht nötig.

FindFirst sucht ja bereits nach dem Namen der Datei, findet es nicht, geht sie nicht in der Block rein (hier try finally), sondern übergeht ihn. Somit kann man sich die FileExists Abfrage sparen, sie kostet nur Zeit.

SR.Size gibt u. U. die falsche Dateigröße zurück, denn es ist Integer. Solange du unter 2 GByte bleibst, merkst du nichts. Die richtige Größe steckt in FindData. Hier die Formel:

Delphi-Quellcode:
x := Int64(SR.FindData.nFileSizeLow) or (Int64(SR.FindData.nFileSizeHigh) shl 32);
//
Ansonsten wird hier jede Datei anscheinend zwei mal angepackt - zuerst um den Namen zu lesen, später noch mal um die Größe zu erfahren. Dabei enthält TSearchRec schon beim ersten Zugriff alle Infos.
  Mit Zitat antworten Zitat