WinAPI的调用访问还没有盘符USB存储设备?(WinAPI calls to access US

2019-09-01 10:51发布

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

什么是WinAPI的电话,我可以用来做那些奇怪的装置一些正常的文件操作 - 这样:

  • 查找/在所有列举的那些设备,
  • 浏览设备上的文件/目录树,并得到一些统计数据文件(大小,修改日期等),
  • 读/写文件的内容,
  • 创建/删除文件/目录?

此外,什么是由这些类型的设备/协议已知/被叫一般关键字?

Answer 1:

如果你谈论的是看起来像安装卷,但没有任何安装点,以及他们被称为移动设备的 Windows便携设备他们没有安装卷

Windows不能直接访问文件系统,它只能通过媒体传输协议 (与他们交流MTP )或图片Transfert协议 ( PTP ),并创建一个外壳命名空间扩展呈现一个虚拟文件夹的用户。

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



Answer 2:

如果你没有任何分配盘符谈论一个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 = %s\n", volumeID);
    GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
    if(strlen(volumePathName) == 0) {
        printf("Not mounted\n");
        newMountPoint[0] = firstFreeLetter();
        if(SetVolumeMountPoint(newMountPoint, volumeID)) {
            GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
            printf("Now mounted on %s\n", volumePathName);
        }
    }
    else {
        printf("Mounted on %s\n", volumePathName);
    }
    GetVolumeInformation(volumePathName, volumeName, 256, &volumeSerialNumber,
                         NULL, NULL, volumeFS, 256);
    printf("Volume name = %s, FS = %s, serial = %lu\n\n",
           volumeName, volumeFS, volumeSerialNumber);

}while(FindNextVolume(handle, volumeID, 256));

FindVolumeClose(handle);

我deliberetely简化此示例,但体积可以有多个安装点( 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;
}


Answer 3:

是。 也有少数情况下,USB驱动器没有一个驱动器号。

  1. 蓝牙设备,USB摄像头可是没有驱动器号。 但是这不是你的情况,因为你提到的存储设备。
  2. 这是注册于PC而不是作为一个存储设备的USB存储设备。 例如。 USB MP3播放器(MTP装置)将被检测为音乐播放器,并没有一个驱动器号。

我相信你是情况#2。

为了访问在存储设备中的文件,你需要强制安装它与盘符的存储设备。 除非你有一个挂载点,你不能访问我相信这些文件。 这取决于设备上。 某些设备(MTP)具有内部设置,以决定是否检测作为存储与否。 您可以探索在MTP设备的设置。

否则,你需要强制所有的存储设备通过代码来安装。



文章来源: WinAPI calls to access USB storage which has no drive letter?