Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Dateigröße als String ausgeben (https://www.delphipraxis.net/129958-dateigroesse-als-string-ausgeben.html)

robinWie 28. Feb 2009 14:03


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;

DeddyH 28. Feb 2009 14:06

Re: Dateigröße als String ausgeben
 
Da fehlt ein CloseFile, oder habe ich das übersehen?

robinWie 28. Feb 2009 14:16

Re: Dateigröße als String ausgeben
 
ne hase nich übersehen.. hab ich glatt vergessen :oops:

Neutral General 28. Feb 2009 14:21

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.

DeddyH 28. Feb 2009 14:25

Re: Dateigröße als String ausgeben
 
Zitat:

Delphi-Quellcode:
Size := FileSize(F) / 8;

Sicher, dass das so stimmt? FileSize ist doch in Byte, oder irre ich mich?

robinWie 28. Feb 2009 14:25

Re: Dateigröße als String ausgeben
 
Zitat:

Zitat von Neutral General
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 -.-

joa hab mich vertan.. statt den or muss da ein and hin. Hab is mir beim blick drauf auch aufgefallen -.-

Zitat:

Zitat von DeddyH
Size := FileSize(F) / 8;
Sicher, dass das so stimmt? FileSize ist doch in Byte, oder irre ich mich?

Ich hatte das erst anders aber dann war das Ergebniss der größe immer eine andere im im windows explorer. Hab dann ein bischen rumexperimentier und rausgefunden wenn ich FileSize durch 8 teile passt das mit den KiB. Ich denke also mal, dass FileSize die größe in Kilobit ausgibt. In der Delphihilfe hab ich nix genaues zu FileSize gefunden, nur dass mir das die Dateigröße ausgibt -.-

Neutral General 28. Feb 2009 14:29

Re: Dateigröße als String ausgeben
 
Hi,

Ok es geht schon besser. Aber bei meiner 4GB Datei spuckt er mir 0,00KiB aus :mrgreen:

robinWie 28. Feb 2009 14:35

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;

DeddyH 28. Feb 2009 14:47

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;

Luckie 28. Feb 2009 14:56

Re: Dateigröße als String ausgeben
 
Warum werden hier die veralteten Pascal Routinen bemüht?

Delphi-Quellcode:
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;
Oder man nutzt MSDN-Library durchsuchenGetFileSizeEx.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.
Seite 1 von 4  1 23     Letzte » 

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