硬盘工厂规模 - C#

时间:2017-04-09 19:32:43

标签: c#

有很多代码可以在Mega Byte中返回硬盘大小。 但我有一个简单的问题。

您购买256 GB硬盘驱动器,但这些方法返回例如234 GB。 我知道工厂尺寸和确切尺寸之间存在差异。但我怎样才能获得工厂规模?任何阶级或方法?或者我应该使用switch caseif else并自行完成?

        ManagementClass mc = new ManagementClass("Win32_DiskDrive");
        double MemSize = 0;
        foreach (ManagementObject mo in mc.GetInstances())
        {
            if (mo["InterfaceType"].ToString() == "IDE")
            {
                MemSize += Convert.ToInt64(mo["Size"].ToString());
                break;
            }
        }
        return GetSize(MemSize);

这是一种使用wmi获取硬盘大小的简单方法,方法GetSize会将大小转换为GB。但它根本不会返回工厂尺寸。

GetSize方法:

    public string GetSize(double len)
    {
        string[] sizes = { "B", "KB", "MB", "GB", "TB" };
        int order = 0;
        while (len >= 1024 && order < sizes.Length - 1)
        {
            order++;
            len = len / 1024;
        }
        return String.Format("{0:0.##} {1}", Math.Floor(len), sizes[order]);

如果我将大小除以1000,它将更接近工厂大小但不是确切的大小,例如256 GB将返回240 GB。

2 个答案:

答案 0 :(得分:3)

硬盘销售的尺寸以10为基数计算,因此1000兆字节是1千兆字节。从技术上讲,我们作为技术类型使用错误的术语,因为1024字节应该真正称为1 mebibyte

因此,要计算不同的大小,需要除以1000而不是1024.您可以轻松修改大小计算,将其作为参数,例如:

public enum SizeType
{
    Actual = 1024,
    Factory = 1000
}

public string GetSize(double len, SizeType sizeType)
{
    string[] sizes = { "B", "KB", "MB", "GB", "TB" };
    int order = 0;
    while (len >= (int)sizeType && order < sizes.Length - 1)
    {
        order++;
        len = len / (int)sizeType;
    }
    return String.Format("{0:0.##} {1}", Math.Floor(len), sizes[order]);
}

现在你可以得到这样的值:

var actual = GetSize(bytes, SizeType.Actual);
var factory = GetSize(bytes, SizeType.Factory);

答案 1 :(得分:1)

出厂尺寸始终除以1000而不是1024。 有关计算的工作原理,请参阅https://www.sevenforums.com/hardware-devices/23890-hdds-advertized-size-vs-actual-size.html

简短版本:将结果以GB为单位除以0.9313226以获得实际大小。