【发布时间】:2012-07-13 10:19:45
【问题描述】:
我想并行化一些磁盘 I/O,但是如果我的文件在同一个磁盘上,这会损害性能。
请注意,驱动程序和实际磁盘之间可能存在各种过滤器驱动程序 - 例如两个文件可能位于不同的虚拟磁盘 (VHD) 上,但位于同一个物理磁盘上。
如何检测两个HANDLEs 是否引用同一个物理磁盘上的文件(或分区,或其他)?
如果这不可能 - 下一个最佳/最接近的替代方案是什么?
【问题讨论】:
我想并行化一些磁盘 I/O,但是如果我的文件在同一个磁盘上,这会损害性能。
请注意,驱动程序和实际磁盘之间可能存在各种过滤器驱动程序 - 例如两个文件可能位于不同的虚拟磁盘 (VHD) 上,但位于同一个物理磁盘上。
如何检测两个HANDLEs 是否引用同一个物理磁盘上的文件(或分区,或其他)?
如果这不可能 - 下一个最佳/最接近的替代方案是什么?
【问题讨论】:
这相当复杂,但第一步是从句柄中获取卷名。您可以在 Vista 或更高版本上使用 GetFinalPathNameByHandle 函数执行此操作。如果需要支持较早的 Windows 版本,可以使用this example。
现在你有了文件名,你可以解析出驱动器号或卷名,并使用this question接受的答案中解释的方法。
【讨论】:
QueryDosDevice 来搜索\DosDevices 命名空间——它从挂载管理器。除此之外,是的,它几乎是一样的(你的优势在于它可以与绕过安装管理器的程序一起使用,比如 ImDisk)。 :) 我想我可能也需要内核模式......但我也不确定在那里调用什么函数。 (我知道这应该是可能的,因为该功能对于安全弹出设备是必需的。)感谢您尝试提供帮助!