2010-10-24 131 views
3

我正在尝试获取连接的USB闪存驱动器的物理设备大小。我曾尝试使用WMI。正确获取磁盘大小

 ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'"); 
     foreach (ManagementObject moDisk in mosDisks.Get()) 
     { 
      lblCapacity.Text = "Capacity: " + moDisk["Size"]; 
     } 

我一直在使用进口来获取几何尝试:

 var geo = new DiskGeometry(); 
     uint returnedBytes; 
     DeviceIoControl(Handle, 0x70000, IntPtr.Zero, 0, ref geo, (uint)Marshal.SizeOf(typeof(DiskGeometry)), out returnedBytes, IntPtr.Zero); 
     return geo.DiskSize; 

他们都做返回一个值..但它是不正确的。

例如,上面的代码返回250056737280. 当我转储整个二进制内容到一个新的文件,FileStream.Length返回250059350015

见的最后一个选项是如何做大?这也是我需要让我的代码按预期工作的正确大小。但我无法转储250GB的数据来获得完整的大小。 那么有没有另一种方法来获得适当的尺寸?

回答

1

您可能会考虑尝试使用IOCTL_DISK_GET_LENGTH_INFO与DevideIoControl。

+0

有趣。我在哪里可以找到那些枚举作为整数,所以我可以把正确的价值? – Eaton 2010-10-24 14:36:24

+1

常量在WinIoCtl.h中定义。 IOCTL_DISK_GET_LENGTH_INFO的值是0x0007405c – 2010-10-24 14:49:59

+0

谢谢,我会尽快尝试并让您知道我的结果。 – Eaton 2010-10-25 23:05:31

0

这对你有用吗?

using System; 
using System.Runtime.InteropServices; 

public class MainClass 
{ 
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, 
     out ulong lpFreeBytesAvailable, 
     out ulong lpTotalNumberOfBytes, 
     out ulong lpTotalNumberOfFreeBytes); 
    public static void Main() 
    { 
     ulong freeBytesAvail; 
     ulong totalNumOfBytes; 
     ulong totalNumOfFreeBytes; 

     if (!GetDiskFreeSpaceEx("C:\\", out freeBytesAvail, out totalNumOfBytes, out totalNumOfFreeBytes)) 
     { 
      Console.Error.WriteLine("Error occurred: {0}", 
       Marshal.GetExceptionForHR(Marshal.GetLastWin32Error()).Message); 
     } 
     else 
     { 
      Console.WriteLine("Free disk space:"); 
      Console.WriteLine(" Available bytes : {0}", freeBytesAvail); 
      Console.WriteLine(" Total # of bytes: {0}", totalNumOfBytes); 
      Console.WriteLine(" Total free bytes: {0}", totalNumOfFreeBytes); 
     } 
    } 
} 

发现这里的上面的例子:http://www.java2s.com/Tutorial/CSharp/0520__Windows/Getfreediskspace.htm

干杯。 Jas。

+0

谢谢,但我无法让它打开我的设备。 http://nvsx.net/i/83679.png那条路一直为我工作。并且是正确的。 – Eaton 2010-10-24 14:25:55

+0

该死的。哦,值得一试。我不确定那里发生了什么,我很害怕。 – 2010-10-24 14:31:21

+0

没关系。即使它有效,我也不认为这是正确的。我想要的总大小,而不是自由大小。此设备也是未格式化的,不是逻辑驱动器号。这就是为什么我需要把物理路径。 – Eaton 2010-10-24 14:33:11