我正在尝试获取连接的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的数据只是为了获得完整的大小。 那么还有另一种方法可以获得合适的尺寸吗?
答案 0 :(得分:1)
您可以考虑使用DevideIoControl尝试IOCTL_DISK_GET_LENGTH_INFO。
答案 1 :(得分: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
干杯。 雅各