2009-08-17 16 views
6

これは単純なものです(私は思う)。Windowsのようにバイト数を表示するDelphi関数

システム組み込み関数、またはファイルのプロパティボックスにWindowsが表示する方法など、バイト数(例:ファイルサイズ)を表示する、Delphiから呼び出すことのできる関数を作成しましたか?

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の使用についてスマートで、KB、MBやGBのための唯一の3桁を示しています。これは、Windowsのプロパティボックスには、様々なサイズを表示する方法です。次に、正確なバイト数をカッコで囲んでカンマで区切って表示します。これは非常に素晴らしいディスプレイで、よく考えられています。

誰もそのような機能を知っていますか?


編集:これには機能がないと非常に驚いています。

ご協力いただきありがとうございます。私は仕事に思われる、これで作ってみた:

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; 

は、これはおそらく十分ですが、より良いものはありますか?

答えて

12

はすべてshlwapi libraryで、以下の機能を参照してください。

それらのいずれかが、あなたに希望の表示形式の最初の部分を与えます。メガバイトが1000または1024キロバイトで構成されているかどうかに関して、ドキュメントを調べるか、独自のテストを作成して、変換が期待されることを確認してください。あなたの表示フォーマットの第二部では、あなたは別のスタックオーバーフローの質問に対する答えを開始することができます:

しかし、その疑問は、そこにあるすべての提案がFloatToStrFと同様にInt64の上限で失敗するため、間違った手段がある可能性があります。数バイトは失われますが、その表示フォーマットの2番目の値の目的は正確な数値を提供することなので、かなり重要なバイトを考慮します。

すべての作品を手に入れたら、一緒に接着してください。私はここで仮想の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; 
+1

StrFormatByteSize64は、Windowsが最初の部分に使用しているようです。しかし、Delphiからその関数を呼び出すにはバッファーを設定する必要があります。 2番目の部分では、floattostrfはあなたのリンクのソリューションよりもうまくいくようです。 – lkessler

+0

あなたは出力がどれくらいの長さでよいかを知っているので、バッファのcharのpacked array [1..n]を使用してください。 @CharArray [1]をポインタとして渡します。 –

+0

優秀な先端! (StrFormatByteSizeW) –

5

ないあなたは後にしている正確に何が、私はあなたにこの1に対処する方法のアイデアを与える可能性があり、私のライブラリ内の関数があります。

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; 
+3

1000年代他にも1024年代ではないでしょうか?しかし、かなり簡潔です。 – lkessler

+0

うん、技術的には1024x1024xでなければなりませんが、これは特定のVideo Server用に書かれたものです。単純な例として投稿 – Gerard

+0

1024で割った場合、ISO標準単位 TiB、GiB、MiBおよびKiBも使用する必要があります。 – dummzeuch

0

これは私の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; 
関連する問題