unidad puedo letra duro disco desde cambio cambiar asignar c++ winapi drives

c++ - duro - no puedo cambiar letra unidad de disco



EnumeraciĆ³n de todas las letras de unidad disponibles en Windows (5)

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 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


No estoy seguro de cómo enumerarlos o si se compilará 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 programa comprueba las unidades de la A a la Z:

#include <windows.h> #include <cstring> #include <sstream> #include <iostream> 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<<drv; 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: "<<charDrv<<endl; break; } case DRIVE_REMOVABLE: { cout<<"Removable drive detected: "<<charDrv<<endl; break; } case DRIVE_NO_ROOT_DIR: { cout<<"There is no volume mounted at the specified path. "<<charDrv<<endl; break; } case DRIVE_REMOTE: { cout<<"The drive is a remote (network) drive. "<<charDrv<<endl; break; } case DRIVE_CDROM: { cout<<"The drive is a CD-ROM drive. "<<charDrv<<endl; break; } case DRIVE_RAMDISK: { cout<<"The drive is a RAM disk. "<<charDrv<<endl; break; } case DRIVE_UNKNOWN: { cout<<"The drive type cannot be determined. "<<charDrv<<endl; break; } } } drv++; } } }


:: 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.