Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Größe einer Datei bestimmen (https://www.delphipraxis.net/15098-groesse-einer-datei-bestimmen.html)

hummer 21. Jan 2004 19:07


Größe einer Datei bestimmen
 
Hallo.
Ich hab eine Datei file.dat. Ich möchte die Größe der Datei ermitteln und dann in einer Statistik ausgeben. Wie kann ich die Größe einer Datei festellen?

Vielen Dank schonmal.

Luckie 21. Jan 2004 19:09

Re: Größe einer Datei bestimmen
 
Delphi-Quellcode:
function GetFileSize(szFile: String): Cardinal;
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*(MAXDWORD))+wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;

fkerber 21. Jan 2004 19:11

Re: Größe einer Datei bestimmen
 
Hi!

Dazu sagt die Hilfe:


Zitat:

Zitat von Hilfe
Delphi-Syntax:

function FileSize(var F): Integer;

Beschreibung

In Delphi können Sie mit FileSize die Größe der angegebenen Datei (F) ermitteln. Die Größe wird als die Anzahl der Datensätze in einer Datensatzdatei ausgedrückt.


Ciao fkerber

Luckie 21. Jan 2004 19:14

Re: Größe einer Datei bestimmen
 
Hm. Und warum verschweigst du ihm den Rest:
Zitat:

Note: FileSize can't be used on a text file.
Oder anders: Deine Antwort würde auf die Frage passen: "Wie viele Datensätze befinden sich in einer typisierten Datei?"

Die größe von binären Dateien kann man so nicht bestimmen!

fkerber 21. Jan 2004 19:19

Re: Größe einer Datei bestimmen
 
Hi!

Das lag daran, dass ich den Rest nicht gelesen hatte :oops: :oops:

Sorry, war keine Absicht, aber ich dachte das wären nur weitere Erläuterungen.
Gudd, dass es Moderatoren gibt, die doch etwas mehr Erfahrung haben.

Also Merkregel: :arrow: Hilfe immer ganz lesen :lol:


Ciao fkerber

hummer 21. Jan 2004 20:00

Re: Größe einer Datei bestimmen
 
Jo danke es funktioniert. :thuimb:

Luckie 21. Jan 2004 20:02

Re: Größe einer Datei bestimmen
 
Alternativ kannst du die Datei auch in einen Stream laden und die Eigenschaft Size nutzen.

hummer 21. Jan 2004 20:14

Re: Größe einer Datei bestimmen
 
Das ist noch besser, da ich sowieso die Datei als Stream lade und speicher.

Popov 13. Okt 2012 02:08

AW: Re: Größe einer Datei bestimmen
 
Sorry, aber ich hab da eine Kleinigkeit entdeckt.

Zitat:

Zitat von Luckie (Beitrag 109961)
Delphi-Quellcode:
function GetFileSize(szFile: String): Cardinal;
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*(MAXDWORD))+wfd.nFileSizeLow;
  windows.FindClose(fFile);
end;

Hier sind evt. zwei Fehler drin. Das gilt auch für die modifizierte Version hier: http://www.delphipraxis.net/24331-da...ermitteln.html

Der erste Punkt ist, dass hier anscheinend besonders große Werte nicht richtig zurück gegeben werden. Meine eigene Funktion hatte übrigens auch den gleichen Größe-Fehler, deshalb begab ich mich auf die Suche. Ich hab eine etwa 6,8 GB Datei geprüft und bekam in beiden Fällen etwa 2,5 GB zurück. Vielleicht gab es 2004 noch nicht so große Dateien um es zu testen.

Das Problem könnte evtl. das Problem lösen:
Delphi-Quellcode:
function GetFileSize4(szFile: String): Int64;
..
begin
  ..
  result := (Int64(wfd.nFileSizeHigh)*(MAXDWORD))+Int64(wfd.nFileSizeLow);
Der zweite Punkt ist evtl. das hier: (MAXDWORD). Laut MS sollte es (MAXDWORD+1) sein. Aber die +1 verkraftet Delphi nicht. Der Fehler ist aber nur paar Byte.

//Edit:

Ich sehe gerade, dass in meinem alten API Buch auch nur (MAXDWORD) steht. Der Fehler liegt also eher da.

Aphton 13. Okt 2012 02:48

AW: Re: Größe einer Datei bestimmen
 
Zitat:

Zitat von Popov (Beitrag 1186856)
Der zweite Punkt ist evtl. das hier: (MAXDWORD). Laut MS sollte es (MAXDWORD+1) sein. Aber die +1 verkraftet Delphi nicht. Der Fehler ist aber nur paar Byte.

"paar Byte" = wfd.nFileSizeHigh

Bei 10 * 4 gb gibt er 10 Byte -demnach- weniger zurück.. unverkraftbar!

himitsu 13. Okt 2012 03:25

AW: Re: Größe einer Datei bestimmen
 
Delphi-Quellcode:
Result := (Int64(wfd.nFileSizeHigh) shl 32) or wfd.nFileSizeLow;

// oder

Int64Rec(Result).Lo := wfd.nFileSizeLow;
Int64Rec(Result).Hi := wfd.nFileSizeHigh;
Und nein, das mit MAXDWORD funktioniert auch ... also wenn man es richtig macht. :angle2:
Delphi-Quellcode:
Result := (Int64(wfd.nFileSizeHigh) * (Int64(MAXDWORD) + 1)) + Int64(wfd.nFileSizeLow);
Aber wenn man weiß, wie in einem 32-Bit-Delphi die 64-Integeroperationen aufgebaut sind, dann läßt man soeinen Mist wie * (MUL), DIV und MOD.

Furtbichler 13. Okt 2012 07:43

AW: Re: Größe einer Datei bestimmen
 
Zitat:

Zitat von Luckie (Beitrag 109964)
Hm. Und warum verschweigst du ihm den Rest:
Zitat:

Note: FileSize can't be used on a text file.
Oder anders: Deine Antwort würde auf die Frage passen: "Wie viele Datensätze befinden sich in einer typisierten Datei?"

Die größe von binären Dateien kann man so nicht bestimmen!

Ach was.
Delphi-Quellcode:
Function TheSizeOf (aFileName : String) : Integer;
Var
 f : File Of Byte;

begin
  AssignFile(f,aFileName);
  ReSet(f);
  MyFileSize := FileSize(F);
  closefile(F);
End;
funktioniert. (Bis 2GB?)

Mir ist neu, das das vom Inhalt abhängt. Die OH besagt übrigens, das 'F' nicht vom Typ 'Textfile' sein darf/kann.
Zitat:

Zitat von fkerber (Beitrag 109966)
Also Merkregel: :arrow: Hilfe immer ganz lesen :lol:

Yo, und anzweifeln. Immer anzweifeln und selber probieren.

himitsu 13. Okt 2012 10:22

AW: Größe einer Datei bestimmen
 
Nur zum Auslesen der Dateigröße besser nicht über das System.FileSize gehn, denn was mag wohl pasieren, wenn man Zugriffsrechte besitzt oder irgendwer die Datei gerade geöffnet hat?


Was mich aber extrem verwundert:
- Bei den Dateifunktionen in der SysUitls hat man tatsächlich die Dateigröße vergessen zu implementieren. :shock:
- Und sogar bei den neuen Funktionen der Delphi-Referenz durchsuchenIOUtils.TFile hat man das total vergessen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 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