【问题标题】:determine if drive is removable (flash or HDD) knowing only the drive letter仅知道驱动器号确定驱动器是否可移动(闪存或 HDD)
【发布时间】:2013-01-31 16:30:32
【问题描述】:

我正在尝试确定文件是否在本地驱动器上。我发现GetDriveType() WINAPI 检索驱动器类型。然而,阅读返回值的描述,这似乎是我的理解,它以 FIXED 形式检索闪存驱动器,这不是我想要的。

它在本地驱动器上工作正常:

bool IsDriveRemovableOrRemote(CString driveRoot)
{
    UINT driveType = GetDriveType(driveRoot);
    return (DRIVE_REMOVABLE == driveType || DRIVE_CDROM == driveType || DRIVE_NO_ROOT_DIR == driveType || DRIVE_REMOTE == driveType);
}

我没有用于测试 ATM 的闪存/外部驱动器,但我想知道是否有人可以告诉我我的解释是否正确?如果是这样,我应该使用什么更好的选择?

请记住,我只有文件的路径。

【问题讨论】:

    标签: windows model-view-controller drive


    【解决方案1】:

    您应该更仔细地阅读文档。虽然闪存驱动器被视为固定设备,但该链接页面中有一条注释:

    要确定驱动器是否为 USB 类型驱动器,请调用 SetupDiGetDeviceRegistryProperty 并指定 SPDRP_REMOVAL_POLICY 属性。

    如果你从路径开始,这个过程似乎有点混乱,但你可以开始阅读文档here。看起来您可能需要枚举设备,直到找到与您的驱动器匹配的设备。

    为避免对您的所有请求执行此操作,我会进行两阶段检查。如果您当前的方法说它不固定,请将其视为非本地的。

    如果它说 已修复,那么您可以使用我建议的方法枚举设备以确定。

    或者,您可以在第一次需要时枚举所有固定的非 USB 驱动器,然后只缓存信息。我很确定这些驱动器的列表在系统运行时不会改变 - 根据定义,添加和删除的驱动器是可移动的。

    【讨论】:

    • 我确实阅读并研究了它,但所有使用它的示例,它们枚举了在我的情况下不可用的所有可用设备,因为我不想每次我的实用程序收到文件时都枚举进程
    • @Red,我会采用两阶段方法,希望能避免这种情况,或者只是缓存信息 - 请参阅更新。
    • 谢谢,等着看有没有其他解决办法。如果没有,那么这可能是使用的方法
    【解决方案2】:

    您可以尝试使用DeviceIoControl 并通过传递IOCTL_STORAGE_QUERY_PROPERTY 作为其第二个参数来查询BusType = BusTypeUsb。阅读page底部的Thomas Lee的Determining USB。

    【讨论】:

    • 这只是为了确定总线类型。如果我想检查 USB 设备或火线,我会毫不犹豫地使用这种方法。但是,例如,那里有外部 SCSI 驱动器,我不能排除它们。
    • 我认为没有任何 100% 可靠的方法。考虑诸如 eSATA 之类的东西;连接到内部端口的内部驱动器,但安装在外部外壳中。
    猜你喜欢
    • 2011-05-22
    • 2011-07-12
    • 2013-02-18
    • 2018-10-09
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多