Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FormatFileSize (https://www.delphipraxis.net/197295-formatfilesize.html)

MicMic 27. Jul 2018 14:06

Delphi-Version: 5

FormatFileSize
 
Hallo, habe hier (Beitrag finde ich irgendwie nicht mehr) diese Funktion entdeckt.
Code:
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;
Die wollte ich gerne nutzen, habe aber auch irgendwo gelesen, dass man "Extended" gar nicht nehmen sollte, sondern "Int64". Ob das nun allg. gemeint war oder speziell... kein Plan. Wollte es nur mal erwähnen, da hier in der Funktion ja "Extended" genommen wird. Die Funktion geht jedenfalls aber wollte hier noch eine kleine Änderung vornehmen, nämlich das nach dem Komma keine Nullen angezeigt werden.

Beispiele:

1,59 = 1,59
1,50 = 1,5
1,02 = 1,02
1,00 = 1

Auch würde ich gerne das Komma durch ein anderes Zeichen ersetzen können (z.B. ein Punkt). Beides kann man natürlich außerhalb der Funktion im nachhinein noch machen aber das wäre wohl nicht die beste Lösung. Auch würde ich gerne mal wissen, wer Dateien hat, die so ab TerraByte anfangen. Alles war danach kommt, kann ich mir dann gar nicht mehr vorstellen... also als einzelne Datei :) Vielleicht die NASA mit Daten in ner ZIP-Datei von 422 Exabyte? *lach

Michael

DeddyH 27. Jul 2018 14:29

AW: FormatFileSize
 
Für die Stelligkeit kannst Du
Zitat:

Delphi-Quellcode:
Result := Format('%.2f %s', [_size, s]);

in
Delphi-Quellcode:
Result := Format('%f %s', [_size, s]);
ändern. Für das Dezimal- bzw. Tausendertrennzeichen könntest Du einen weiteren Parameter definieren. Dann musst Du aber innerhalb der Funktion entsprechende TFormatSettings deklarieren und diese in der Überladung der Format-Funktion mit übergeben.

[edit] Ich sehe gerade: Delphi 5, stimmt das? Falls ja, klappt das nicht so wie beschrieben, dann müsstest Du die globale Variable Decimalseparator manipulieren, aber bitte vorher Wert sichern und zum Schluss wiederherstellen. [/edit]

MicMic 27. Jul 2018 14:50

AW: FormatFileSize
 
Danke für deine Hilfe aber ".2" wegzulassen, geht nicht. Ich glaub ".2" ist sowieso Standard, wenn man es nicht angibt.

Ich habe die Zeile mit dem Format eben mal so geändert/erweitert:
Code:
 Result := Format('%.2f', [_size]);
 if Result[Length(Result)]='0' then result := Copy(Result,0,Length(Result)-1);
 if Result[Length(Result)]='0' then result := Copy(Result,0,Length(Result)-1);
 if Result[Length(Result)]=',' then result := Copy(Result,0,Length(Result)-1);
 Result := Result + ' '+s;
So komme ich zu meinem Ziel aber ist hier wohl keine gute Lösung. Mit dieser Idee könnt ich auch leicht das Komma in ein anderes Zeichen austauschen.
Nutze Delphi 10 (die neue Community-Version). Das da Delphi 5 steht, ist mir nie aufgefallen. Das hat das Forum wohl als Standard gesetzt, als ich mich hier registriert habe. Ändere ich gleich mal.

Edit: Mit der Version... das war bei der Thread-Erstellung. Da gibt es auch ein Eingabefeld dazu. Dort steht 5 als Standard :)

Michael

MicMic 27. Jul 2018 15:13

AW: FormatFileSize
 
Wer rundet jetzt falsch? Windows oder die Funktion?

Eine Datei mit 1148928 Bytes

1148928 / 1024 / 1024 = 1,0957031

Also eigentlich aufrunden. Das macht die Funktion. Also sie gibt 1,1 MiB zurück.

Windows 10 spuckt aber 1.09 raus (mit der Angabe MB. So wie ich das verstanden habe sollte ja hier dann "MiB" stehen)

Alles mal wieder durcheinander :)

Michael

Uwe Raabe 27. Jul 2018 15:23

AW: FormatFileSize
 
Mit Format geht das wohl nicht, wohl aber mit FormatFloat:

Delphi-Quellcode:
result := Format('%s %s' [FormatFloat('0.##', _size, TFormatSettings.Invariant), s]);

MicMic 27. Jul 2018 16:16

AW: FormatFileSize
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1408893)
Mit Format geht das wohl nicht, wohl aber mit FormatFloat:

Delphi-Quellcode:
result := Format('%s %s' [FormatFloat('0.##', _size, TFormatSettings.Invariant), s]);

Super. Danke. Nach '%s %s' musste ich noch ein Komma einfügen. Nun habe ich versucht den Punkt wieder als Komma zu ändern. Ich will beides nutzen. Ein "0,##" geht hier nicht :) Habe gelesen, dass man bei den TFormatSettings etwas machen muss, sprich dieses "DecimalSeparator" dafür zuständig ist. Dieses "TFormatSettings.Invariant" soll Standard sein. Muss ich dann ein "TFormatSettings.Create" usw. machen? Aber was ist Standard (TFormatSettings.Invariant)? Ist es nicht eine Windows-Einstellung? Wenn ja, dann ist dies wohl nicht sicher, dass der Punkt ausgegeben wird. Irgendwo kann man in Windows ja diese Dinge abändern (auch für ein Datum usw.). Halt ne Benutzereinstellung.

Und Format rundet ja den Wert auf. Wie ich oben geschrieben habe, macht Windows wieder ne andere Rundung. Jeder kocht irgendwie sein eigenes Süppchen, sprich ich brauch wieder 2 Versionen, damit der Benutzer entscheiden kann. Den Befehl "Format" dazu bewegen, abzurunden... das ist bestimmt auch eine "TFormatSettings" Einstellung?

Michael

DieDolly 27. Jul 2018 16:33

AW: FormatFileSize
 
Zitat:

Zitat von MicMic (Beitrag 1408890)
Wer rundet jetzt falsch? Windows oder die Funktion?

Eine Datei mit 1148928 Bytes

1148928 / 1024 / 1024 = 1,0957031

Also eigentlich aufrunden. Das macht die Funktion. Also sie gibt 1,1 MiB zurück.

Windows 10 spuckt aber 1.09 raus (mit der Angabe MB. So wie ich das verstanden habe sollte ja hier dann "MiB" stehen)

Alles mal wieder durcheinander :)

Michael

MiB ist richtig, MB ist falsch.
1148928 Bytes sind ungerundet 1,09 MiB. Gerundet 1,1 MiB.

MicMic 27. Jul 2018 17:10

AW: FormatFileSize
 
Ich hab jetzt:
Code:
fs := TFormatSettings.Create;
fs.DecimalSeparator := '.';
result := Format('%s %s', [FormatFloat('0.##', _size, fs), s]);
.free brauch ich ja hier nicht (verwirrt mich immer). So habe ich den "Punkt" und wenn ich ein Komma haben möchte mach ich dann natürlich "fs.DecimalSeparator := ',';".
Je nach dem wo der Code steht, muss man noch "Application.UpdateFormatSettings := false;" setzen, da sonst bei "WM_WININICHANGE" oder "RM_TaskbarCreated" die FormatSettings wieder überschrieben werden (hier im Forum in einem Thread gelesen). Nur mal so als Info.

Jetzt fragt sich nur noch wie ich dem "Format" beibringen kann, ob er auf/abrunden soll. Es wird ja aufgerundet.

Zitat:

MiB ist richtig, MB ist falsch.
1148928 Bytes sind ungerundet 1,09 MiB. Gerundet 1,1 MiB.
1,0957031 = 1,09 (kann man jetzt als abrunden oder abschneiden sehen). Also sollte man in diesen Fällen (Anzeige von Dateigrößen) dann nicht aufrunden? Also wie Windows es machen?

Michael

P.s. Der Total-Commander gibt beispielsweise "1,0 M" zurück. Jeder macht's anders. Da weiß man gar nicht, welcher Weg der richtige ist.

DieDolly 27. Jul 2018 17:14

AW: FormatFileSize
 
Ich denke am besten ist es, wenn man nicht rundet und nach der, sagen wir mal zweiten Stelle, alles abschneidet.
Ich gucke da gerne auf Linux. Die zeigen MB (nicht MiB) richtig an. Die nehmen das also etwas ernster.

Hier mal ein Beispiel.
https://www.thinkbroadband.com/download
Da kann man Testdateien runterladen. Die 5 MB große Datei sind in Wirklichkeit 5,2 MB.
Was Windows falsch anzeigt, übernehmen also auch Webseitenbetreiber blind.

Daher mein Rat, sich das mal unter Linux anzusehen. Dort wird's richtig gemacht.

Luckie 27. Jul 2018 17:18

AW: FormatFileSize
 
Verwirrt es dich auch nach dem Duschen den Hahn zu zu drehen und die benutze Wäsche in den Wäschekorb zu werfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Seite 1 von 3  1 23      

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