Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

DeddyH 28. Feb 2009 14:03

Re: Dateigröße als String ausgeben
 
Ich denke, mit den veralteten Pascal-Routinen dürfte es auch unter Linux mit Lazarus funktionieren (ungetestet).

robinWie 28. Feb 2009 14:18

Re: Dateigröße als String ausgeben
 
Ich hab die überarbeitete Version von DeddyH mit dem einwand von Lucki kombiniert. Dabei bin ich davon ausgegangen, dass die Methode von Lucki die Größe in Byte liefert. Wenns anders ist bitte schreit ;)

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
  Size: Extended;
  _Unit: integer;
  S: string;
  Divisor: Integer;

  fFile: THandle;
  wfd: TWin32FINDDATA;
begin
  if not FileExists(FileName) then
    begin
      Result := 'FNE';
      Exit;
    end;

  try

    fFile := FindFirstfile(PChar(FileName), wfd);
    if fFile = INVALID_HANDLE_VALUE then
      begin
        Result := 'ERR';
        Exit;
      end;
 
    if Use1024 then
      Divisor := 1024
    else
      Divisor := 1000;

    Size := ((wfd.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wfd.nFileSizeLow) / Divisor; // Size in Kib or KB
    windows.FindClose(fFile);    

    _Unit := Low(Sizes1024);

    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;

DeddyH 28. Feb 2009 14:24

Re: Dateigröße als String ausgeben
 
Dann nimm aber die Tippfehler noch raus.
Delphi-Quellcode:
wfd: TWin32FINDDATA;
...
fFile := FindFirstfile(PChar(FileName), wfd);
...
Size := ((wfd.nfileSizeHigh * (int64(MAXDWORD) + 1)) + wfd.nFileSizeLow) / Divisor;

robinWie 28. Feb 2009 14:30

Re: Dateigröße als String ausgeben
 
Ich muss mal n wach macher trinken^^

aber der
Delphi-Quellcode:
Size := ((wfd.nfileSizeHigh * (int64(MAXDWORD) + 1)) + wfd.nFileSizeLow) / Divisor;
is doch richtig. Die Klammen müssen da ja wegen dem "+" hin ;)

DeddyH 28. Feb 2009 14:32

Re: Dateigröße als String ausgeben
 
Du hattest aber
Zitat:

Delphi-Quellcode:
wfd-nFileSizeLow //- statt .

da stehen ;)

robinWie 28. Feb 2009 14:34

Re: Dateigröße als String ausgeben
 
mmh.. ich werd heute mal delphi ausmachen.. das wird eh nix mehr^^

igel457 28. Feb 2009 14:43

Re: Dateigröße als String ausgeben
 
Vielleicht sollte man anstatt der Win32-API-Funktionen auch TFileStream verwenden. Dann läuft das ganze nämlich auch unter Linux und mit Dateigrößen > 2GB (Integer).

DeddyH 28. Feb 2009 15:10

Re: Dateigröße als String ausgeben
 
Gute Idee.
Delphi-Quellcode:
function GetFileSizeAsString(const 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
  Size: Extended;
  _Unit: integer;
  S: string;
  Divisor: Integer;
  fStream: TFileStream;
begin
  if not FileExists(FileName) then
    begin
      Result := 'FNE';
      Exit;
    end;

  try
    if Use1024 then
      Divisor := 1024
    else
      Divisor := 1000;

    fStream := TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
    try
      Size := fStream.Size / Divisor;
    finally
      fStream.Free;
    end;
 
    _Unit := Low(Sizes1024);

    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;
[edit] den Filename-Parameter als const definiert. [/edit]

Satty67 28. Feb 2009 15:23

Re: Dateigröße als String ausgeben
 
Welchen Datentyp verwenden neuere Delphi für TFileStream.Size? Mein leicht angegrautes D5 nur LongInt (also 2 GB max).

Rein theoretisch könnte auch ein Singe weit mehr als ein YB darstellen, oder?

DeddyH 28. Feb 2009 15:24

Re: Dateigröße als String ausgeben
 
Unter Delphi 2007 ist das ein Int64.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:47 Uhr.
Seite 2 von 4     12 34      

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