AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateigröße als String ausgeben

Ein Thema von robinWie · begonnen am 28. Feb 2009 · letzter Beitrag vom 19. Feb 2010
 
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#28

Re: Dateigröße als String ausgeben

  Alt 13. Feb 2010, 11:17
Zitat von DeddyH:
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]
Deine Methode ist leider falsch Dein Stream gibt die Bytes und keine KiloBytes zurück. Du fängst bei deiner Zählung aber schon mit KB an. Somit kommt immer eine Einheit größer raus, als es sollte. Habe mir gerade über eine 7,1 TiB große Datei gewundert.

Zudem habe ich die Formatierung von der Ermittlung der Dateigröße getrennt:
Delphi-Quellcode:
{ Diese Methode gibt die Dateigröße in Byte zurück. Dafür wird intern TFileStream verwendet, um auch
  unter Linux lauffähig zu sein. }

function GetFileSize(const AFileName: String): Int64;
var
  fileStream: TFileStream;
begin
  if (not FileExists(AFilename)) then
    raise Exception.Create('File does not exist.');

  // TFileStream nutzen, sodass das Ding auch unter Linux laufen könnte ;)
  fileStream := TFileStream.Create(AFileName,fmOpenRead or fmShareDenyNone);
  try
    Result := fileStream.Size;
  finally
    fileStream.Free();
  end;
end;

{ Diese Methode formatiert die Dateigröße und nutzt dafür das passende Format. Hier kann zudem auch
  noch angegeben werden, ob mit 2^10 oder 1000  gerechnet werden soll, was sich auf die Einheit
  auswirkt. }

function FormatFileSize(const AFileSize: Int64; Use1024: Boolean = True): String;
const
  Sizes1024: array[0..8] of string = ('Bytes', 'KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB');
  Sizes1000: array[0..8] of string = ('Bytes', 'KB','MB','GB','TB','PB','EB','ZB','YB');
var
  _size: Extended;
  _Unit: integer;
  s: string;
  Divisor: Integer;
begin
  try
    if (Use1024) then
      Divisor := 1024
    else
      Divisor := 1000;

    _size := AFileSize;
    _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;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 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