2012-07-02 66 views
0

我無法找到任何代碼(均未ç也不C++ Boost.Filsystem)如何迭代解析)存在於一個獨立於平臺的方式在preferrably的PATH環境變量中的目錄。編寫起來並不難,但如果可用的話,我想重新使用標準模塊。鏈接或建議任何人?環境路徑目錄迭代

+1

你的意思是從'PATH'與目錄的列表,以最終提取目錄?如果是這樣的話,你可以使用'boost :: split()',並使用':'作爲分隔符,將windows上的unix和';'使用。 – hmjd

+0

@hmjd偉大的,這個作品!但是,從C++算法風格的角度來看,Boost的'split_iterator '更加優雅。謝謝。請參閱http://www.boost.org/doc/libs/1_49_0/doc/html/string_algo/usage.html#id3183933 –

回答

1

這是我使用之前:

const vector<string>& get_environment_PATH() 
{ 
    static vector<string> result; 
    if(!result.empty()) 
     return result; 

#if _WIN32 
    const std::string PATH = convert_to_utf8(_wgetenv(L"PATH")); // Handle Unicode, just remove if you don't want/need this. convert_to_utf8 uses WideCharToMultiByte in the Win32 API 
    const char delimiter = ';'; 
#else 
    const std::string PATH = getenv("PATH"); 
    const char delimiter = ':'; 
#endif 
    if(PATH.empty()) 
     throw runtime_error("PATH should not be empty"); 

    size_t previous = 0; 
    size_t index = PATH.find(delimiter); 
    while(index != string::npos) 
    { 
     result.push_back(PATH.substr(previous, index-previous)); 
     previous=index+1; 
     index = PATH.find(delimiter, previous); 
    } 
    result.push_back(PATH.substr(previous)); 

    return result; 
} 

這隻每次程序運行的「計算」,一旦事。它也不是線程安全的,但是,與環境無關。

0

這是我自己的代碼片段沒有先進的Boost庫:

if(exe.GetLength()) 
{ 
    wchar_t* pathEnvVariable = _wgetenv(L"PATH"); 

    for(wchar_t* pPath = wcstok(pathEnvVariable, L";") ; pPath ; pPath = wcstok(nullptr, L";")) 
    { 
     CStringW exePath = pPath; 
     exePath += L"\\"; 
     exePath += exe; 

     if(PathFileExists(exePath)) 
     { 
      exe = exePath; 
      break; 
     } 
    } //for 
} //if