【问题标题】:How to detect if two files are on the same physical disk?如何检测两个文件是否在同一个物理磁盘上?
【发布时间】:2012-07-13 10:19:45
【问题描述】:

我想并行化一些磁盘 I/O,但是如果我的文件在同一个磁盘上,这会损害性能。

请注意,驱动程序和实际磁盘之间可能存在各种过滤器驱动程序 - 例如两个文件可能位于不同的虚拟磁盘 (VHD) 上,但位于同一个物理磁盘上。

如何检测两个HANDLEs 是否引用同一个物理磁盘上的文件(或分区,或其他)?

如果这不可能 - 下一个最佳/最接近的替代方案是什么?

【问题讨论】:

    标签: winapi file-io disk


    【解决方案1】:

    这相当复杂,但第一步是从句柄中获取卷名。您可以在 Vista 或更高版本上使用 GetFinalPathNameByHandle 函数执行此操作。如果需要支持较早的 Windows 版本,可以使用this example

    现在你有了文件名,你可以解析出驱动器号或卷名,并使用this question接受的答案中解释的方法。

    【讨论】:

    • 这是最简单的部分! I already have a better solution for that。 :) 问题在于它给你的是 logical 磁盘,而不是 physical 磁盘——磁盘顶部可能有一些虚拟化层(包括但不限于到 VHD 文件),这可能会给你一个误报,所以很遗憾它不能解决问题中的问题。
    • @Mehrdad:不确定我是否理解您从句柄中查找文件名的解决方案有什么更好的地方。似乎与我建议的方法相同(我同意这是简单的部分)。但是你是对的,我的回答并没有解决你的问题。我的(错误)理解是 VHD 不会显示为 \\.\PhysicalDriveX,但事实并非如此。进一步挖掘,我认为您不会找到一种方法来区分虚拟磁盘和物理磁盘与用户模式代码,因为虚拟化发生在如此低的级别。祝你好运。这是一个有趣的问题,现在困扰着我。
    • 我提到“更好”的唯一原因是它不需要使用QueryDosDevice 来搜索\DosDevices 命名空间——它从挂载管理器。除此之外,是的,它几乎是一样的(你的优势在于它可以与绕过安装管理器的程序一起使用,比如 ImDisk)。 :) 我想我可能也需要内核模式......但我也不确定在那里调用什么函数。 (我知道这应该是可能的,因为该功能对于安全弹出设备是必需的。)感谢您尝试提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2020-09-09
    • 2019-08-09
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多