2008-09-24 4 views

ответ

5

Будем надеяться, что следующий фрагмент кода даст вам достаточно, чтобы решить эту проблему - после того, как вы инициализируются его, вам просто нужно перебрать коллекцию чтобы найти ваш матч. Вы можете конвертировать все в верхний/нижний регистр, прежде чем вставлять их в коллекцию, чтобы помочь с результатами поиска.

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

Если вам нужно обрабатывать съемные диски, вы можете использовать GetLogicalDeviceStrings получить существующие устройства динамически. Вам нужно усечь строки устройства так, чтобы конечный «\» не передавался QueryDosDevice. – 2011-03-24 17:55:07

1

Следующая функция делает работу с использованием C только

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); 
}