c# - 如何在没有 WMI 的情况下知道两个分区是否在一个物理硬盘中?

标签 c# windows wmi disk-partitioning

例如,我有那些分区(在 Windows 中):

Hard Disk 1 - Partition C, Partition D
Hard Disk 2 - Partition E

程序语言中是否有任何方法可以知道分区 C 和分区 D 是否在一个物理硬盘中没有 WMI

我不想使用 WMI,因为它很慢 - 对于这个例子,我花了 0.5 秒。我需要它快点。

谢谢。

最佳答案

我不知道有任何其他管理方式来获取磁盘分区信息。 您可以使用 C# 中的 P/Invoke 来使用 Win32 API。但是,除非绝对必要,否则您不应该这样做。

您需要的 Win32 函数称为 DeviceIoControl()。 API 文档可在 http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx 找到.使用控制代码 IOCTL_STORAGE_GET_DEVICE_NUMBER 调用 DeviceIoControl(),您将获得给定分区设备句柄的物理磁盘驱动器。可以使用 CreateFile() API 检索分区的设备句柄。

但是,使用 DeviceIoControl() 很麻烦,您很可能必须为 32 位和 64 位版本的 Windows 制作不同的版本。

要检索所有分区,您可以像这样使用托管代码 System.IO.DriveInfo:

var x = from di in DriveInfo.GetDrives()
        where (di.DriveType == DriveType.Fixed)
        select di;

foreach (DriveInfo di in x)
{
    // Call DeviceIoControl() using the partition name from di.Name and the IOCTL_STORAGE_GET_DEVICE_NUMBER  control code to retrieve the physical disk
}

pinvoke.net 似乎有一些 signatures for C#.

关于c# - 如何在没有 WMI 的情况下知道两个分区是否在一个物理硬盘中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443554/

相关文章:

c# - 如何将 IoC 容器保持在一个地方,而内部类需要在 bee 构造后创建依赖项

c# - 在未安装 SQL 的客户端计算机上使用 SQL 库

c# - 调用 GetOwner 时获取 InvalidOperationException

c# - 如何将 ObservableCollection<T> 绑定(bind)到 WrapPanel?

c# - SQL Server 通知 - 我的 OnChange 不触发

windows - 如何通过直接在设备上执行 DeviceIoControl() 来获取 USB 设备描述符?

c++ - 我如何在不提供给/dev/null的情况下使libcurl的输出静音?

windows - 关于 JvPatchFile 组件?

java - 以毫秒为单位解析 CIM_DateTime 到 Java Date

c# - ManagementObject.GetMethodParameters 方法的可能值?