Formatowanie rozmiaru na dysku z jednostką

0

Witam wszystkich, niedawno padł mi dysk, a razem z nim moje funkcje itd. Miałem na nim swoją funkcje konwertującą rozmiar pliku na sting'a w postaci B, KB, MB, TB itd. Nie chce mi się pisać ponownie, pomoże ktoś?

3
function FormatFileSize(const SizeInBytes: Int64): string;
const
  KiloByte = 1024;
  MegaByte = KiloByte * 1024;
  GigaByte = MegaByte * 1024;
  TeraByte = GigaByte * 1024;
begin
  if SizeInBytes < KiloByte then
    Result := Format('%d B', [SizeInBytes])
  else if SizeInBytes < MegaByte then
    Result := Format('%.2f KB', [SizeInBytes / KiloByte])
  else if SizeInBytes < GigaByte then
    Result := Format('%.2f MB', [SizeInBytes / MegaByte])
  else if SizeInBytes < TeraByte then
    Result := Format('%.2f GB', [SizeInBytes / GigaByte])
  else
    Result := Format('%.2f TB', [SizeInBytes / TeraByte]);
end;
var
  SizeInBytes: Int64;
  FileSizeString: string;
begin
  SizeInBytes := 1548496; // Replace this with the actual file size in bytes
  FileSizeString := FormatFileSize(SizeInBytes);
  Writeln(FileSizeString); // Output: "1.48 MB"
end;
0

@darkonepl dzieki

4
uses
Winapi.Windows, System.Math;

function GetFileSize(const FileName: string): Int64;
var
  AttributeData: TWin32FileAttributeData;
begin
  if GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @AttributeData) then
  begin
    Int64Rec(Result).Lo := AttributeData.nFileSizeLow;
    Int64Rec(Result).Hi := AttributeData.nFileSizeHigh;
  end
  else
    Result := -1;
end;

function ConvertBytes(Bytes: Int64): string;
const
  Description: Array [0 .. 8] of string = ('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
var
  i: Integer;
begin
  i := 0;

  while Bytes > Power(1024, i + 1) do
    i := i + 1;

  Result := FormatFloat('###0.##', Bytes / IntPower(1024, i)) + ' ' + Description[i];
end;
0

@first_person
Dzięki.

2

Podane wyżej obliczenia są nieprawidłowe — albo liczby są złe, albo jednostki. :]

Tak tylko przypomnę, że kilobajt to 1000 bajtów, tak samo jak kilogram to 1000 gramów (i tak samo jak kilometr to 1000 metrów). Jeśli używacie typowych przedrostków, to dzielcie liczbę bajtów przez 1000, a jeśli dzielicie przez 1024 to zmieńcie jenostki na kibibajty (skrót to KiB). Więcej na ten temat znajdziecie np. w wikipedii:

screenshot-20230804231209.png

Źródło: https://pl.wikipedia.org/wiki/Kilobajt

3
furious programming napisał(a):

Tak tylko przypomnę, że kilobajt to 1000 bajtów, tak samo jak kilogram to 1000 gramów (i tak samo jak kilometr to 1000 metrów). Jeśli używacie typowych przedrostków, to dzielcie liczbę bajtów przez 1000, a jeśli dzielicie przez 1024 to zmieńcie jenostki na kibibajty (skrót to KiB). Więcej na ten temat znajdziecie np. w wikipedii:
Źródło: https://pl.wikipedia.org/wiki/Kilobajt

Tylko że nawet w tym cytowanym źródle piszą:

W przeciwieństwie do innych dziedzin nauki, w informatyce przedrostek kilo oznacza często nie krotność 10^3, lecz 2^10:

i dosłownie nikt nie używa słów "kibibajt", "mebibajt" chyba że chce wyjść na d.bila ;)

https://stackoverflow.com/questions/176922/do-you-use-kibibyte-as-a-unit-of-measurement-in-your-programs
image

Aby uniknąć niejednoznaczności, w wielu krajach (w tym w Polsce) przyjęło się używanie wielkiej litery K dla oznaczania krotności 1024, zaś małej k – dla krotności 1000. Podobnie wielka litera B oznacza bajt, mała b – bit.

The binary meaning of the kilobyte for 1024 bytes typically uses the symbol KB, with an uppercase letter K. The B is often omitted in informal use. For example, a processor with 65,536 bytes of cache memory might be said to have "64 K" of cache. In this convention, one thousand and twenty-four kilobytes (1024 KB) is equal to one megabyte (1 MB), where 1 MB is 1024^2 bytes

czyli po prostu "KB" = 1024 B, "kB" = 1000 B, a jakieś "KiB" to tylko propozycja IEC która z moich obserwacji się nigdzie nie przyjęła.

Krótko mówiąc - jednostki w powyższych postach są jak najbardziej ok choć mylące - dla pewności warto pisać dokładną ilość bajtów w nawiasie, ale mało kogo w sumie obchodzi wielkość pliku z taką precyzją więc w sumie bez znaczenia.

0

Są dwie konwencje, MiB wprowadzono później. W Windows chyba nigdy tego nie było. Czasami to widać, ale raczej się słabo przyjęło

1 użytkowników online, w tym zalogowanych: 0, gości: 1