22

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

4

7 回答 7

50

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

您可能存在差异的原因可能是由于 driveinfo 报告为“可用空间”和 Windows 认为可用空间的差异。

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

此外,尽管您的编译器无论如何都应该对此进行优化,但只需将每个幅度的位移动 10 即可完成此计算:

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

尽管为了可读性,我希望连续除以 1024 会更清晰。

于 2009-02-19T15:05:08.903 回答
25

XKCD有明确的答案

KB 的单一、权威标准

于 2009-02-19T15:16:23.510 回答
12

/// <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"
于 2010-10-21T06:11:42.400 回答
11

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

  • 1000 字节是 1 千字节,1000KB 是 1 MB,依此类推。缩写有KB、MB、GB等。
  • 广泛使用的 1024 字节 = 1 KB 应改为称为 1024 字节 = 1 千字节 (KiB)、1024 字节 = 1 兆字节 (MiB)、1024 字节 = 1 吉字节 (GiB) 等等。

大家可以在IEC SI zone上阅读。

因此,为了使您的转换根据国际标准化正确无误,您应该使用这种科学记数法。

于 2009-02-19T16:24:43.430 回答
4

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

于 2009-02-19T15:07:09.710 回答
1

我隐约记得是使用 1000 还是 1024 的答案在于前缀的大小写。示例:如果使用“科学”1000 标度,则“科学”单位将为 kB(如 kg、kN 等)。如果使用以计算机为中心的 1024 缩放,则单位为 KB。因此,将科学前缀大写使其以计算机为中心。

于 2010-01-08T12:34:58.507 回答
0

除以 1024。

于 2009-02-19T15:06:24.050 回答