WinAPI调用访问没有驱动器号的USB存储器?

我注意到,有些USB存储设备不会在Windows中注册为常规驱动器,因为它们甚至没有分配驱动器号。 因此,我不能使用标准文件操作C API显然访问它们。

我可以用什么WinAPI调用来对这些奇怪的设备进行一些正常的文件操作 - 例如:

  • 根本找不到/列举这些设备,
  • 浏览设备上的文件/目录树并获取一些文件统计信息(大小,修改日期等),
  • 读/写文件的内容,
  • 创建/删除文件/目录?
  • 另外,这些类型的设备/协议是通用的关键字是什么?


    如果您所谈论的移动设备看起来像装入的卷,但没有任何装入点,那么它们被称为Windows便携式设备,而且它们不是装入的卷

    Windows不直接访问文件系统,它只通过媒体传输协议(MTP)或图片传输协议(PTP)与它们进行通信,并创建一个shell命名空间扩展来向用户显示一个虚拟文件夹。

    如果你想与这些设备进行通信,那么你很可能想要使用WPD API


    如果您正在讨论没有任何分配驱动器盘符的USB大容量存储设备,那么这只是一个没有安装点的卷。 您需要在读取/写入之前安装卷。

    您可以使用卷管理功能:

  • FindFirstVolume和FindNextVolume来获取卷GUID
  • GetVolumePathNamesForVolumeName知道该卷是否已挂载(并获取挂载点)
  • SetVolumeMountPoint安装一个卷
  • 下面是C语言中一个快速编写的示例,列出所有现有卷,装入未安装的卷并显示有关每个卷的一些信息:

    char volumeID[256], volumePathName[256], volumeName[256], volumeFS[256];
    char newMountPoint[4] = " :";
    unsigned long volumeSerialNumber;
    unsigned long size;
    HANDLE handle = FindFirstVolume(volumeID, 256);
    do {
        printf("Volume GUID = %sn", volumeID);
        GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
        if(strlen(volumePathName) == 0) {
            printf("Not mountedn");
            newMountPoint[0] = firstFreeLetter();
            if(SetVolumeMountPoint(newMountPoint, volumeID)) {
                GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
                printf("Now mounted on %sn", volumePathName);
            }
        }
        else {
            printf("Mounted on %sn", volumePathName);
        }
        GetVolumeInformation(volumePathName, volumeName, 256, &volumeSerialNumber,
                             NULL, NULL, volumeFS, 256);
        printf("Volume name = %s, FS = %s, serial = %lunn",
               volumeName, volumeFS, volumeSerialNumber);
    
    }while(FindNextVolume(handle, volumeID, 256));
    
    FindVolumeClose(handle);
    

    我谨慎地简化了这个例子,但是一个卷可以有多个挂载点( volumePathName实际上是一个多字符串)。 它使用此函数获取第一个可用的字母( 'C'后面)来安装驱动器:

    char firstFreeLetter() {
        unsigned long freeLetters = GetLogicalDrives();
        if(freeLetters < 4) return 0;
        char letter = 'C';
        for(unsigned long i=4; (freeLetters & i) != 0; ++letter, i <<= 1);
        return letter;
    }
    

    是。 USB驱动器没有驱动器号的情况很少。

  • 蓝牙设备,USB相机没有驱动器号。 但是这不是你的情况,因为你提到了存储设备。
  • 在PC中注册的USB存储设备,而不是存储设备。 例如。 USB MP3播放器(MTP设备)将被检测为音乐播放器,并且没有驱动器盘符。
  • 我相信你是案例#2。

    为了访问存储设备中的文件,您需要强制将其作为带有盘符的存储设备进行安装。 除非你有一个挂载点,否则你不能访问我相信的文件。 这取决于设备。 某些设备(MTP)具有内部设置以决定是否检测为存储或不存储。 您可以浏览MTP设备中的设置。

    否则,您需要强制所有存储设备通过代码进行安装。

    链接地址: http://www.djcxy.com/p/71331.html

    上一篇: WinAPI calls to access USB storage which has no drive letter?

    下一篇: Entity Framework 5 always try to connect to sqlexpress instead of local db