Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verzeichnisgröße ermitteln -> Probleme mit großen Dateien (https://www.delphipraxis.net/37422-verzeichnisgroesse-ermitteln-probleme-mit-grossen-dateien.html)

gkoeder 5. Jan 2005 18:10


Verzeichnisgröße ermitteln -> Probleme mit großen Dateien
 
Hallo!

Derzeit bastle ich mir eine Rekursiv-Routine zusammen, um die Größe von Verzeichnissen zu ermitteln. Dabei verwende ich FindFirst und FindNext zusammen mit einem tSearchRec. Nur ergab sich jetzt bei dieser Konstellation ein kleines Problem:

tSearchRec.Size beinhaltet die größe der gefundenen Datei in Bytes. Nur ist 'Size' als Integer definiert und so ein wenig eingeschränkt bei großen Dateien. Kenn jemand eine Möglichkeit, hier auch die Größe von sehr großen Dateien (4GB, ...) richtig zu ermitteln?

Thanks!

Nightshade 5. Jan 2005 18:17

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Delphi-Quellcode:
function FileSize(Filename : string): int64;
var
  fs : TFileStream;
begin
  result := -1;
  try
    fs := TFileStream.Create(Filename, fmOpenRead OR fmShareDenyWrite);
    result := fs.Size;
  finally
    fs.free;
  end;
end;
Das benutze ich immer ...

Luckie 5. Jan 2005 19:26

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Ich benutze immer das:
Delphi-Quellcode:
function GetFileSize(szFile: PChar): Int64;
var
  fFile: THandle;
  wfd: TWIN32FINDDATA;
begin
  result := 0;
  if not FileExists(szFile) then exit;
  fFile := FindFirstfile(pchar(szFile),wfd);
  if fFile = INVALID_HANDLE_VALUE then exit;
  result := (wfd.nFileSizeHigh*(Int64(MAXDWORD) + 1))+wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;

dizzy 5. Jan 2005 19:47

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Zitat:

Zitat von Luckie
Ich benutze immer das:
Delphi-Quellcode:
function GetFileSize(szFile: PChar): Int64;
  fFile := FindFirstfile(pchar(szFile),wfd);

Warum casetet du hier einen PChar nochmals nach PChar? :gruebel:

Luckie 5. Jan 2005 19:51

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Ups. :oops: Ich war irgendwann mal gerade dabei den Parameter der Funktion in einen String zu ändern, als ich wohl mal wieder Delphi Support per ICQ spielen musste. :roll:

Ihr glaubt gar nicht wie viele Tastaturen ohne die F1 Taste ausgeliefert werden. :mrgreen:

gkoeder 5. Jan 2005 19:59

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Vielen Dank für die Tipps - hab' meine Routine umgebaut und jetzt klappts auch mit großen Dateien.

Thanks!

P.S. Interessant ist auch, dass ich bei meiner tSearchRec-Routine keine Fehlermeldung o.ä. erhalten hab' - der Wert von Size ging einfach an den Maximalwert und das wars; Wären nicht einige Verzeichnisse so recht putzig ausgefallen, dann wär mir das wahrscheinlich gar nicht so aufgefallen...

Luckie 5. Jan 2005 20:02

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Was soll auch passieren? Es kommt einfach zu einem Überlauf. Hättest du allerdings das Overflow Checking aktiviert hättest du auf eine Delphi-Referenz durchsuchenEIntOverflow Exception reagieren können:
Zitat:

EIntOverflow is the exception class for integer calculations whose results are too large to fit in the allocated register.

EIntOverflow is an integer math exception that occurs when a calculated result is too large to fit in the register allocated for it and data is therefore lost.

EIntOverflow is raised only if overflow checking is turned on. To turn on overflow checking, include the $Q+ directive in project source code, or select Project|Options, choose the Compiler tab, and check the Overflow-checking option in the dialog box.

Christian Seehase 5. Jan 2005 22:47

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Moin Zusammen,

TSearchRec liefert sehr wohl auch die Grösse von Dateien > 2GB, allerdings etwas "unhandlich", nämlich aufgeteilt auf die DWORDs
TSearchRec.FindData.nFileSizeHigh und TSearchRec.FindData.nFileSizeLow.

Muetze1 5. Jan 2005 23:27

Re: Verzeichnisgröße ermitteln -> Probleme mit großen Dat
 
Moin!

Ich will nur Methode von Nightshade noch anmerken, das u.a. bis Delphi 5 die TStream's Objekte (auch TFileStream) noch mit Integer definiert sind und noch nicht mit Int64. Daher ist die Lösung nicht für alle Delphi Versionen praktikabel - der Code von Luckie funktioniert dabei auf diesen Delphi Version ohne Einschränkung.

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.

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