【问题标题】:How do I find out what physical drive a file is on?如何找出文件在哪个物理驱动器上?
【发布时间】:2013-08-20 12:50:06
【问题描述】:

我想知道文件在什么物理媒体上(通过文件名或句柄)。

我读过here,我可以通过DeviceIoControl 调用来确定给定分区句柄的物理驱动器。

但是如何从文件名中获取分区句柄? (因为 NTFS 允许在文件夹中挂载分区,所以我不能简单地按驱动器号。)

我问的原因是,使用异步方法将文件复制到另一个物理驱动器最快,但在同一个驱动器上,使用更大的缓冲区同步完成时速度最快。我想编写一个函数来确定给定文件和目标的最佳复制算法。

【问题讨论】:

  • 我希望您必须在所有连接的媒体中搜索该文件,因为 Windows 没有保留将文件名映射到卷号的表。
  • 我希望你的意思是逻辑驱动。例如,我的 SQL 服务器将其主要数据存储在三个运行 RAID5 的 SAS 15K 驱动器上。存储在 RAID 上的文件同时在 所有 驱动器上(分布在它们之间)。
  • @WhozCraig 是的,但是如果两个逻辑驱动器驻留在同一个物理驱动器上(如果可能的话),我仍然希望使用同步复制。

标签: c++ winapi


【解决方案1】:

Windows 中的卷通常映射到驱动器号(网络共享除外)。

您可以使用CreateFile() 在源和目标上创建卷文件设备句柄,只需传入驱动器号路径(即:\\.\C:\)。将返回的句柄与DeviceIoControl() 一起使用。比较源和目标之间的物理驱动器,你应该很好。

此处解释的讨论:“要获取卷的物理驱动器标识符,请打开 ...” http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

【讨论】:

  • 实际上,卷被映射到驱动器号,但它们没有被映射。通过使用 Win32 API 绕过前缀 `\\.`,仍然可以通过 NT 命名空间访问未映射的卷。它们可以被创建、打开、读取和写入。
  • 我不能按驱动器号,因为一个卷可能安装在另一个卷上的目录中。我可能需要使用GetVolumePathNameGetVolumeNameForVolumeMountPoint 来解决这个问题,然后解析卷名(这是指向“\Device\HarddiskVolumeX”的符号链接)。然后我可以枚举“HarddiskYPartitionZ”设备,看看哪一个指向我刚刚解析的设备 X。那么 Y 是我的物理驱动器。
  • 一旦您获得来自GetVolumePathName() 的音量,您可能仍然可以按照我的建议使用CreateFile()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2013-02-27
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多