Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

Satty67 28. Feb 2009 15:28

Re: Dateigröße als String ausgeben
 
Also irgendwo im ExaByte Bereich Schluß? :gruebel:

DeddyH 28. Feb 2009 15:34

Re: Dateigröße als String ausgeben
 
Das hab ich jetzt nicht nachgerechnet :lol:

Hawkeye219 28. Feb 2009 15:35

Re: Dateigröße als String ausgeben
 
Hallo,

ich würde die Ermittlung der Dateigröße von deren Formatierung trennen. Die einzelnen Routinen sind dann universeller einsetzbar.

Gruß Hawkeye

robinWie 28. Feb 2009 15:39

Re: Dateigröße als String ausgeben
 
Zitat:

Zitat von Satty67
Also irgendwo im ExaByte Bereich Schluß? :gruebel:

Könnt sein aber welche Datei ist schon vonner Dateigrößte im ExaByte betreich? :D

Satty67 28. Feb 2009 15:54

Re: Dateigröße als String ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also finde so große Zahlen faszinierend und kopiere mir auch fleißig Euren Code ;)
INT64 ist die größte Integer Zahl in D5, da hab ich mir halt gemerkt, das die 9,2 ExaByte fassen kann (wenn es überhaupt richtig ist :lol: )

Zitat:

Zitat von robinWie
Könnt sein aber welche Datei ist schon vonner Dateigrößte im ExaByte betreich? :D

Naja... also Euer Code da oben... ähem... also... ach egal. Mein erster PC hatte Anfang der 90er eine richtig teure 10 MB Festplatte und die hab' ich sogar noch. Wer weis was da noch kommt...

(Hoffe bin nicht zu OT hier)

Cyf 28. Feb 2009 20:57

Re: Dateigröße als String ausgeben
 
NTFS unterstützt derzeit sowieso nur 16TiB als Maximalgröße einer Datei. :wink:

DeddyH 28. Feb 2009 21:22

Re: Dateigröße als String ausgeben
 
Naja, immerhin sind wir so auch für die Zukunft gerüstet :lol:

s.h.a.r.k 13. Feb 2010 11:17

Re: Dateigröße als String ausgeben
 
Zitat:

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 :zwinker: 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;

Aphton 14. Feb 2010 18:00

Re: Dateigröße als String ausgeben
 
[OT]
Zitat:

Zitat von wikipedia
The kibibyte is a multiple of the unit byte for quantities of digital information. The binary prefix kibi means 1024, therefore 1 kibibyte is 1024bytes. The unit symbol for the kibibyte is KiB.[1] The unit was established by the International Electrotechnical Commission (IEC) in 2000 and has been accepted for use by all major standards organizations. It was designed to replace the kilobyte used in some computer science contexts to mean 1024 bytes, which conflicts with the SI definition of the prefix kilo.

Obwohl nun seit 2000 feststeht, dass 1024 Bytes = 1 KiB <> 1 KB (wusst ich gar nicht), wird heute ausschließlich die zweitere Darstellung verwendet, soweit ich mich nicht täusche. Warum?
[/OT]

himitsu 14. Feb 2010 18:15

Re: Dateigröße als String ausgeben
 
Zitat:

Zitat von Aphton
Warum?

Sowas wurde hier schon mehrmals diskutiert ... unteranderem wohl auch dort http://www.delphipraxis.net/internal...t.php?t=170328


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.
Seite 3 von 4     123 4      

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