Enumeración de todas las letras de unidad disponibles en Windows

Quiero enumerar todas las letras de unidad disponibles (que todavía no están tomadas) en Windows usando VC ++.

¿Cómo puedo hacer esto?

:: GetLogicalDrives () devuelve una lista de unidades disponibles (leer: usadas) como bits en una máscara. Esto debería incluir unidades de red mapeadas. Por lo tanto, simplemente puede caminar los bits para encontrar los bits que son cero, lo que significa que no hay unidad presente. En caso de duda, siempre puede llamar :: GetDriveType () con la letra de la unidad + ":\" ( ":\\" en el código C, o _T(":\\") en terminología consciente de Unicode, por supuesto) , y eso debería devolver DRIVE_UNKNOWN o DRIVE_NO_ROOT_DIR si el disco está disponible.

GetLogicalDriveStrings puede obtener solo la lista de letras de unidad utilizadas actualmente.

GetVolumeInformation se puede usar para obtener más información sobre un disco específico.

La función GetLogicalDriveStrings es un buen punto de partida.

No estoy seguro de cómo enumerarlos o si se comstackrá en c ++ visual, pero modifiqué esto en Dev C ++ o Code Blocks para verificar qué unidad es accesible usando CreateFile y qué tipo de unidad es usando GetDriveType. El progtwig comprueba las unidades de la A a la Z:

 #include  #include  #include  #include  using namespace std; int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nShowCmd) { HANDLE hDevice = NULL; HANDLE fileFind = NULL; while(true) { Sleep(3005); char drv='A'; while(drv!='[') { Sleep(105); const char *charDrvCF; const char *charDrv; stringstream Str; string drvStr; Str<>drvStr; string drvSpc=drvStr+":\\"; string fCheck="\\\\.\\"; string fhCheck=fCheck+drvStr+":"; charDrvCF=fhCheck.c_str(); charDrv=drvSpc.c_str(); hDevice=CreateFile(charDrvCF, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice!=INVALID_HANDLE_VALUE) { switch(GetDriveType(charDrv)) { case DRIVE_FIXED: { cout<<"Fixed drive detected: "< 

GetLogicalDrives y GetLogicalDriveStrings no ven las unidades de red creadas en un espacio de nombres diferente.

Por ejemplo, llamar a las funciones de un servicio que se ejecuta en el Sistema local no verá las unidades de red creadas por un usuario registrado.

Esto está sucediendo a partir de Windows XP. El siguiente artículo describe este caso: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx