问题
I am trying to get the physical device size of a connected USB flash drive. I have tried using WMI.
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'");
foreach (ManagementObject moDisk in mosDisks.Get())
{
lblCapacity.Text = "Capacity: " + moDisk["Size"];
}
I have tried using imports to get the geometry:
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;
They all do return a value.. but it is not correct.
For example, the above code returns 250056737280. When I dump the entire binary contents to a new file, FileStream.Length returns 250059350015
See how the last option is bigger? That is also the corrrect size I need to get for my code to work as expected. But I cannot dump 250gb of data just to get the full size. So is there another method to get proper size?
回答1:
You might consider trying IOCTL_DISK_GET_LENGTH_INFO with DevideIoControl.
回答2:
Is this any use for you?
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);
}
}
}
Found the above example here: http://www.java2s.com/Tutorial/CSharp/0520__Windows/Getfreediskspace.htm
Cheers. Jas.
来源:https://stackoverflow.com/questions/4008620/getting-disk-size-properly