德尔福功能来显示的字节数为Windows并(Delphi Function to Display N

2019-09-24 01:15发布

这是一个简单的(我认为)。

有没有内置功能的系统,或者有人创建了一个可以从德尔福调用的函数,将显示一个字节数(如文件大小),这样Windows显示在文件的属性框的?

例如,这是由于Windows属性框中如何显示各种尺寸:

539 bytes (539 bytes)
35.1 KB (35,974 bytes)
317 MB (332,531,365 bytes)
2.07 GB (2,224,617,077 bytes)

该显示器是智能有关使用字节,KB,MB或GB,并且仅示出了3对KB,MB和GB显著数字。 然后,它通过使用逗号分隔数千显示在括号中的字节的确切数目如下。 这是一个非常不错的显示,深思熟虑。

有谁知道这样的功能呢?


编辑:我很惊讶没有一个功能这一点。

感谢您的有益的想法。 我想出了这一点,这似乎工作:

function BytesToDisplay(A:int64): string;
var
  A1, A2, A3: double;
begin
  A1 := A / 1024;
  A2 := A1 / 1024;
  A3 := A2 / 1024;
  if A1 < 1 then Result := floattostrf(A, ffNumber, 15, 0) + ' bytes'
  else if A1 < 10 then Result := floattostrf(A1, ffNumber, 15, 2) + ' KB'
  else if A1 < 100 then Result := floattostrf(A1, ffNumber, 15, 1) + ' KB'
  else if A2 < 1 then Result := floattostrf(A1, ffNumber, 15, 0) + ' KB'
  else if A2 < 10 then Result := floattostrf(A2, ffNumber, 15, 2) + ' MB'
  else if A2 < 100 then Result := floattostrf(A2, ffNumber, 15, 1) + ' MB'
  else if A3 < 1 then Result := floattostrf(A2, ffNumber, 15, 0) + ' MB'
  else if A3 < 10 then Result := floattostrf(A3, ffNumber, 15, 2) + ' GB'
  else if A3 < 100 then Result := floattostrf(A3, ffNumber, 15, 1) + ' GB'
  else Result := floattostrf(A3, ffNumber, 15, 0) + ' GB';
  Result := Result + ' (' + floattostrf(A, ffNumber, 15, 0) + ' bytes)';
end;

这可能是够用了,但有什么好?

Answer 1:

请参阅下面的功能,都在SHLWAPI库 。

  • StrFormatByteSizeA (DWORD参数)
  • StrFormatByteSizeW (Int64的参数)
  • StrFormatByteSize64 (在Unicode模式下,它是真正StrFormatByteSizeW
  • StrFormatByteSizeEx (Vista SP2的;可以控制倒圆)

任何人都会给你你想要的显示格式的第一部分。 检查文件或写自己的测试,以确认他们给你期待和一兆字节是否包括1000或1024千字节的转换。 为了您的显示格式的第二部分,你可以用回答另一个堆栈溢出的问题开始:

  • 如何转换为int货币? (他确实问如何插入逗号,没有特别钱。)

但也许这个问题是错误的途径往下走,因为所有的建议有,以及FloatToStrF ,在失败的上限Int64 。 你会失去几个字节,但我认为那非常重要的字节,因为在显示格式的第二个值的目的是提供一个确切的数字。

一旦你把所有的作品,粘合在一起他们。 我使用的是一个假设的IntToStrCommas功能在这里,如果你想要实现的FloatToStrF ,请便。

function BytesToDisplay(const num: Int64): string;
var
  // If GB is the largest unit available, then 20 characters is
  // enough for "17,179,869,183.99 GB", which is MaxUInt64.
  buf: array[0..20] of Char;
begin
  if StrFormatByteSize64(num, buf, Length(buf)) = nil then
    raise EConvertError.CreateFmt('Error converting %d', [num]);
  Result := Format('%s (%s bytes)', [buf, IntToStrCommas(num)]);
end;


Answer 2:

不正是你追求的,但我有我的库中的函数,可能会给你一个想法如何解决这一个:

function FormatByteSize(const bytes: Longword): string;
var
  B: byte;
  KB: word;
  MB: Longword;
  GB: Longword;
  TB: UInt64;
begin

  B  := 1; //byte
  KB := 1024 * B; //kilobyte
  MB := 1000 * KB; //megabyte
  GB := 1000 * MB; //gigabyte
  TB := 1000 * GB; //teraabyte

  if bytes > TB then
    result := FormatFloat('#.## TB', bytes / TB)
  else
    if bytes > GB then
      result := FormatFloat('#.## GB', bytes / GB)
    else
      if bytes > MB then
        result := FormatFloat('#.## MB', bytes / MB)
      else
        if bytes > KB then
          result := FormatFloat('#.## KB', bytes / KB)
        else
          result := FormatFloat('#.## bytes', bytes) ;
end;


Answer 3:

这是从我的dzlib单位u_dzConvertUtils :

/// these contants refer to the "Xx binary byte" units as defined by the
/// International Electronical Commission (IEC) and endorsed by the
/// IEE and CiPM </summary>
const
  OneKibiByte = Int64(1024);
  OneMebiByte = Int64(1024) * OneKibiByte;
  OneGibiByte = Int64(1024) * OneMebiByte;
  OneTebiByte = Int64(1024) * OneGibiByte;
  OnePebiByte = Int64(1024) * OneTebiByte;
  OneExbiByte = Int64(1024) * OnePebiByte;

/// <summary>
/// Converts a file size to a human readable string, e.g. 536870912000 = 5.00 GiB (gibibyte) </summary>
function FileSizeToHumanReadableString(_FileSize: Int64): string;
begin
  if _FileSize > 5 * OneExbiByte then
    Result := Format(_('%.2f EiB'), [_FileSize / OneExbiByte])
  else if _FileSize > 5 * OnePebiByte then
    Result := Format(_('%.2f PiB'), [_FileSize / OnePebiByte])
  else if _FileSize > 5 * OneTebiByte then
    Result := Format(_('%.2f TiB'), [_FileSize / OneTebiByte])
  else if _FileSize > 5 * OneGibiByte then
    Result := Format(_('%.2f GiB'), [_FileSize / OneGibiByte])
  else if _FileSize > 5 * OneMebiByte then
    Result := Format(_('%.2f MiB'), [_FileSize / OneMebiByte])
  else if _FileSize > 5 * OneKibiByte then
    Result := Format(_('%.2f KiB'), [_FileSize / OneKibiByte])
  else
    Result := Format(_('%d Bytes'), [_FileSize]);
end;


文章来源: Delphi Function to Display Number of Bytes as Windows Does