正确获取磁盘大小

4

我正在尝试获取连接的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的数据。 因此,是否有其他方法可以获得正确的尺寸?

2个回答

1

这对你有用吗?

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。


谢谢,但我无法打开我的设备。http://nvsx.net/i/83679.png 这个路径一直对我有用。而且是正确的。 - Eaton
该死。好吧,值得一试。恐怕我不确定那里发生了什么。 - Jason Evans
没关系。即使它能工作,我也认为那样做不对。我想要的是总大小,而不是可用大小。这个设备还没有格式化,也不是逻辑驱动器盘符。这就是为什么我需要输入物理路径的原因。 - Eaton

1

有趣。我在哪里可以找到那些枚举作为整数,以便我可以放入正确的值? - Eaton
1
常量定义在WinIoCtl.h中。IOCTL_DISK_GET_LENGTH_INFO的值为0x0007405c。 - Chris Taylor
谢谢,我会尽快尝试并告诉您我的结果。 - Eaton
1
完美地工作了,现在返回了完整和正确的磁盘大小。 - Eaton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接