2010-10-24 156 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