2008-09-24 6 views

Respuesta

5

Esperemos que el siguiente fragmento de código le dará lo suficiente para solucionar esto - después de haber inicializado él, sólo tiene que recorrer la colección para encontrar tu pareja Es posible que desee convertir todo en mayúsculas/minúsculas antes de insertar en la colección para ayudar con el rendimiento de búsqueda.

typedef basic_string<TCHAR> tstring; 
typedef map<tstring, tstring> HardDiskCollection; 

void Initialise(HardDiskCollection &_hardDiskCollection) 
{ 
    TCHAR tszLinkName[MAX_PATH] = { 0 }; 
    TCHAR tszDevName[MAX_PATH] = { 0 }; 
    TCHAR tcDrive = 0; 

    _tcscpy_s(tszLinkName, MAX_PATH, _T("a:")); 
    for (tcDrive = _T('a'); tcDrive < _T('z'); ++tcDrive) 
    { 
     tszLinkName[0] = tcDrive; 
     if (QueryDosDevice(tszLinkName, tszDevName, MAX_PATH)) 
     { 
      _hardDiskCollection.insert(pair<tstring, tstring>(tszLinkName, tszDevName)); 
     } 
    } 
} 
+3

Si usted necesita para manejar las unidades extraíbles, puede utilizar GetLogicalDeviceStrings para obtener los dispositivos existentes de forma dinámica. Tendrá que truncar las cadenas del dispositivo para que el "\" final no se pase a QueryDosDevice. –

1

siguiente función hace el trabajo usando C sólo

BOOL GetWin32FileName(const TCHAR* pszNativeFileName, TCHAR *pszWin32FileName) 
{ 
    BOOL bFound = FALSE; 

    // Translate path with device name to drive letters. 
    TCHAR szTemp[MAX_PATH]; 
    szTemp[0] = '\0'; 

    if (GetLogicalDriveStrings(MAX_PATH - 1, szTemp)) 
    { 
     TCHAR szName[MAX_PATH]; 
     TCHAR szDrive[3] = TEXT(" :"); 
     TCHAR* p = szTemp; 

     do 
     { 
      // Copy the drive letter to the template string 
      *szDrive = *p; 

      // Look up each device name 
      if (QueryDosDevice(szDrive, szName, MAX_PATH)) 
      { 
       size_t uNameLen = _tcslen(szName); 

       if (uNameLen < MAX_PATH) 
       { 
        bFound = _tcsnicmp(pszNativeFileName, szName, uNameLen) == 0 
         && *(pszNativeFileName + uNameLen) == _T('\\'); 

        if (bFound) 
        { 
         // Replace device path with DOS path 
         StringCchPrintf(pszWin32FileName, 
          MAX_PATH, 
          TEXT("%s%s"), 
          szDrive, 
          pszNativeFileName + uNameLen); 
        } 
       } 
      } 
      // Go to the next NULL character. 
      while (*p++); 
     } while (!bFound && *p); 
    } 

    return(bFound); 
} 
Cuestiones relacionadas