2017-04-09 59 views
2

有很多代码块可以返回兆字节中的硬盘大小。 但我有一个简单的问题。硬盘驱动器的厂房大小 - C#

您购买了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硬盘大小。但它根本不会返回Factory Size。

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。

+0

工厂大小通常(总是?)以1000的倍数而不是1024来测量,因为它看起来像一个比它大的大小。你最好坚持你在这里的东西。 – DavidG

+0

@DavidG有没有办法修复返回工厂大小的GetSize方法? – Nofuzy

+0

只需在您的GetSize方法中将1000替换为1000即可获得“工厂”大小。 –

回答

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

这个问题最近的编辑增加了除以1000仍然不会给他们任何值他们正在寻找,但+1,无论如何,扩大他们的方法来说明不同程度的磁盘大小真实性。一旦他们计算出魔术数字,他们只需要添加第三枚枚举值,以便为他们提供他们正在寻找的任意磁盘大小。我同意你上面的评论,试图将准确数字转换为不准确数字的前提是有缺陷的。 – BACON

+0

也有各种各样的东西可以“偷走”你实际可以使用的空间,这可能是差异在这里。 – DavidG