如何正确地将文件大小字节转换为兆字节或千兆字节?

时间:2009-02-19 15:03:05

标签: c# byte disk driveinfo megabyte

我在C#项目中使用DriveInfo类来检索给定驱动器上的可用字节。如何正确地将此数字转换为兆字节或千兆字节?除以1024将无法完成我的工作。结果总是与Windows资源管理器中显示的结果不同。

7 个答案:

答案 0 :(得分:48)

1024在程序中的使用是正确的。

您可能遇到差异的原因可能是由于driveinfo报告为“可用空间”以及Windows认为可用空间的差异。

请注意,只有驱动器制造商使用1,000。在Windows和大多数程序中,正确的缩放是1024。

此外,虽然你的编译器应该优化它,但是这个计算可以通过仅为每个幅度移位10来完成:

  

KB = B>> 10个
  MB = KB>> 10 = B>> 20个
  GB = MB>> 10 = KB>> 20 = B>> 30

虽然为了便于阅读,我希望连续除以1024更清楚。

答案 1 :(得分:24)

XKCD有definite answer

Single, definitive standard for KB

答案 2 :(得分:11)

/// <summary>
/// Function to convert the given bytes to either Kilobyte, Megabyte, or Gigabyte
/// </summary>
/// <param name="bytes">Double -> Total bytes to be converted</param>
/// <param name="type">String -> Type of conversion to perform</param>
/// <returns>Int32 -> Converted bytes</returns>
/// <remarks></remarks>
public static double ConvertSize(double bytes, string type)
{
    try
    {
        const int CONVERSION_VALUE = 1024;
        //determine what conversion they want
        switch (type)
        {
            case "BY":
                 //convert to bytes (default)
                 return bytes;
                 break;
            case "KB":
                 //convert to kilobytes
                 return (bytes / CONVERSION_VALUE);
                 break;
            case "MB":
                 //convert to megabytes
                 return (bytes / CalculateSquare(CONVERSION_VALUE));
                 break;
            case "GB":
                 //convert to gigabytes
                 return (bytes / CalculateCube(CONVERSION_VALUE));
                 break;
            default:
                 //default
                 return bytes;
                 break;
          }
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
         return 0;
      }
}

/// <summary>
/// Function to calculate the square of the provided number
/// </summary>
/// <param name="number">Int32 -> Number to be squared</param>
/// <returns>Double -> THe provided number squared</returns>
/// <remarks></remarks>
public static double CalculateSquare(Int32 number)
{
     return Math.Pow(number, 2);
}


/// <summary>
/// Function to calculate the cube of the provided number
/// </summary>
/// <param name="number">Int32 -> Number to be cubed</param>
/// <returns>Double -> THe provided number cubed</returns>
/// <remarks></remarks>
public static double CalculateCube(Int32 number)
{
     return Math.Pow(number, 3);
}

//Sample Useage
String Size = "File is " + ConvertSize(250222,"MB") + " Megabytes in size"

答案 3 :(得分:10)

1024实际上是错误的。国际工程界(IEC)在2000年制定了一项标准,令人遗憾地被计算机行业所忽视。这个标准基本上就是说

  • 1000字节是千字节,1000KB是1 MB,依此类推。缩写为KB,MB,GB等。
  • 广泛使用的1024字节= 1千字节应改为调用1024字节= 1 Kibibyte(KiB),1024 KiB = 1 Mebibyte(MiB),1024 MiB = 1 Gibibyte(GiB)等等。

您可以在IEC SI zone上阅读。

因此,为了使您的转换正确且符合国际标准化,您应该使用此科学记数法。

答案 4 :(得分:4)

这取决于您是否需要实际文件大小或磁盘大小。实际文件大小是文件在内存中使用的实际字节数。磁盘上的大小是磁盘/文件系统的文件大小和块大小的函数。

答案 5 :(得分:1)

我有一个微弱的回忆,关于是否使用1000或1024的答案位于前缀的大小写中。 例: 如果使用“科学”1000缩放,那么“科学”单位将是kB(就像以kg,kN等为单位)。如果使用以计算机为中心的1024缩放,则单位将为KB。因此,高估科学前缀使其以计算机为中心。

答案 6 :(得分:0)

除以1024。