我注意到,一些USB存储设备无法在Windows注册为常规驱动器,因为他们甚至不得到分配驱动器号。 因此,我显然不能使用标准的文件操作C API访问它们。
什么是WinAPI的电话,我可以用来做那些奇怪的装置一些正常的文件操作 - 这样:
- 查找/在所有列举的那些设备,
- 浏览设备上的文件/目录树,并得到一些统计数据文件(大小,修改日期等),
- 读/写文件的内容,
- 创建/删除文件/目录?
此外,什么是由这些类型的设备/协议已知/被叫一般关键字?
我注意到,一些USB存储设备无法在Windows注册为常规驱动器,因为他们甚至不得到分配驱动器号。 因此,我显然不能使用标准的文件操作C API访问它们。
什么是WinAPI的电话,我可以用来做那些奇怪的装置一些正常的文件操作 - 这样:
此外,什么是由这些类型的设备/协议已知/被叫一般关键字?
如果你谈论的是看起来像安装卷,但没有任何安装点,以及他们被称为移动设备的 Windows便携设备 , 他们没有安装卷 。
Windows不能直接访问文件系统,它只能通过媒体传输协议 (与他们交流MTP )或图片Transfert协议 ( PTP ),并创建一个外壳命名空间扩展呈现一个虚拟文件夹的用户。
如果你想与这些类型的设备进行通信,那么你很可能要使用的WPD API 。
如果你没有任何分配盘符谈论一个USB大容量存储设备,然后它只是没有挂载点的卷。 你需要读/写之前先安装卷。
您可以使用卷管理功能 :
GUID
这是一个在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;
}
是。 也有少数情况下,USB驱动器没有一个驱动器号。
我相信你是情况#2。
为了访问在存储设备中的文件,你需要强制安装它与盘符的存储设备。 除非你有一个挂载点,你不能访问我相信这些文件。 这取决于设备上。 某些设备(MTP)具有内部设置,以决定是否检测作为存储与否。 您可以探索在MTP设备的设置。
否则,你需要强制所有的存储设备通过代码来安装。