2008-09-24 88 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); 
}