Se si sta parlando di un dispositivo di archiviazione di massa USB senza alcuna lettera di unità assegnata, si tratta solo di un volume senza un punto di montaggio. Avrai bisogno di montare il volume prima di leggerlo/scriverlo.
È possibile utilizzare il Volume Management Functions:
Ecco uno scritto in fretta esempio in C che elenca tutti i volumi esistenti, montare quelli montati e mostra alcune informazioni su ogni volume:
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);
I deliberetely semplificare questo esempio, tuttavia il volume può avere più punti di montaggio (volumePathName
è in realtà un multi -stringa). Si utilizza questa funzione per ottenere la prima lettera disponibile (dopo 'C'
) per montare un drive:
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;
}
Suppongo che si tratti di una sorta di lettore multimediale? A volte questi dispositivi presentano la loro archiviazione tramite un'estensione dello spazio dei nomi della shell. È possibile utilizzare IShellFolder e gli amici per accedervi. – Luke