![]() |
Dateigröße als String ausgeben
Ich hab eine kleine Routine geschrieben mit der man sich die Dateigröße einer Datei als String ausgeben lasse kann. Die Dateigröße wird als Zahl so klein wie möglich ausgegeben und mit der entsprechenden Einheit versehen. Verwendet werden Binärpräfixe (Kibibyte, Mebibyte... (umrechnungfaktor 1024))
Beispiel Dateigröße: 12288 Byte Ausgabe: 1,5 MiB Bei einem Fehler wird 'ERR' ausgegeben. Wenn die Datei nicht existiert wird 'FNE' ausgegeben. Parameter: FileName: dürfte klar sein^^ Digits: Anzahl der Nachkommastellen bei der Ausgabe
Delphi-Quellcode:
function GetFileSizeAsString(FileName: string; Digits: integer = 2): string;
var F: File; Size: Extended; _Unit: integer; S: string; begin if not FileExists(FileName) then begin Result := 'FNE'; Exit; end; try AssignFile(F, FileName); Reset(F); _Unit := 0; Size := FileSize(F) / 8; // Size in KiB CloseFile(F); while (Size >= 1024) and (_Unit < 7 ) do begin Size := Size / 1024; Inc(_Unit); end; case _Unit of 0: S := 'KiB'; // Size in Kibibyte 1: S := 'MiB'; // Size in Mebibyte 2: S := 'GiB'; // Size in Gibibyte 3: S := 'TiB'; // Size in Tebibyte 4: S := 'PiB'; // Size in Pebibyte 5: S := 'EiB'; // Size in Exbibyte 6: S := 'ZiB'; // Size in Zebibyte 7: S := 'YiB'; // Size in Yobibyte end; Result := FloatToStrF(Size, ffFixed, 15, Digits) + ' ' + S; except Result := 'ERR'; end; end; |
Re: Dateigröße als String ausgeben
Da fehlt ein CloseFile, oder habe ich das übersehen?
|
Re: Dateigröße als String ausgeben
ne hase nich übersehen.. hab ich glatt vergessen :oops:
|
Re: Dateigröße als String ausgeben
Hi,
Also der Code ist noch nicht so ganz ideal... Hab die Funktion mit ner ca. 450KB großen Datei aufgerufen und du kannst dir vorstellen was ich zurück bekommen habe... "0,00 YiB" Also ich will keine 450KB Datei in YiB ausgegeben haben :stupid: Edit: Ich würde sogar fast behaupten, dass deine Funktion bei allen (normalsterblichen) Dateien "0,00 YiB" ausgibt. Denn so groß ist keine Datei -.- Edit2: War zu faul zum rechnen und habs aus Spaß mal bei einer 4GB Datei probiert (FAT32 kann imo nichtmal größere Dateien verwalten wenn ich mich richtig erinnere) und das Ergebnis ist selbst bei so einer riesigen Datei 0,00 YiB. |
Re: Dateigröße als String ausgeben
Zitat:
|
Re: Dateigröße als String ausgeben
Zitat:
Zitat:
|
Re: Dateigröße als String ausgeben
Hi,
Ok es geht schon besser. Aber bei meiner 4GB Datei spuckt er mir 0,00KiB aus :mrgreen: |
Re: Dateigröße als String ausgeben
Habs gerade getestet, bei mir funzt es aber...
So hab ichs bei mir aufgebaut:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin opendialog1.Execute; ShowMessage(GetFileSizeAsString(opendialog1.FileName)); end; |
Re: Dateigröße als String ausgeben
Ich hab das Ganze mal ein wenig erweitert:
Delphi-Quellcode:
function GetFileSizeAsString(FileName: string; Use1024: Boolean = true): string;
const Sizes1024: array[0..7] of string = ('KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'); Sizes1000: array[0..7] of string = ('KB','MB','GB','TB','PB','EB','ZB','YB'); var F: File of Byte; //um sicherzugehen Size: Extended; _Unit: integer; S: string; Divisor: Integer; begin if not FileExists(FileName) then begin Result := 'FNE'; Exit; end; if Use1024 then Divisor := 1024 else Divisor := 1000; try AssignFile(F, FileName); FileMode := fmOpenRead; //damit auch schreibgeschützte Dateien geöffnet werden können Reset(F); _Unit := Low(Sizes1024); Size := FileSize(F) / Divisor; // Size in KiB or KB CloseFile(F); while (Size >= Divisor) and (_Unit < High(Sizes1024)) do begin Size := Size / Divisor; Inc(_Unit); end; if Use1024 then S := Sizes1024[_Unit] else S := Sizes1000[_Unit]; Result := Format('%.2f %s',[Size,S]); except Result := 'ERR'; end; end; |
Re: Dateigröße als String ausgeben
Warum werden hier die veralteten Pascal Routinen bemüht?
Delphi-Quellcode:
Oder man nutzt
function GetFileSize(Filename: string): Int64;
var fFile : THandle; wfd : TWIN32FINDDATA; begin result := -1; if not FileExists(Filename) then exit; fFile := FindFirstfile(pchar(Filename), wfd); if fFile = INVALID_HANDLE_VALUE then exit; result := (wfd.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wfd.nFileSizeLow; windows.FindClose(fFile); end; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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 by Thomas Breitkreuz