0
我無法找到任何代碼(均未ç也不C++ Boost.Filsystem)如何迭代(解析)存在於一個獨立於平臺的方式在preferrably的PATH
環境變量中的目錄。編寫起來並不難,但如果可用的話,我想重新使用標準模塊。鏈接或建議任何人?環境路徑目錄迭代
我無法找到任何代碼(均未ç也不C++ Boost.Filsystem)如何迭代(解析)存在於一個獨立於平臺的方式在preferrably的PATH
環境變量中的目錄。編寫起來並不難,但如果可用的話,我想重新使用標準模塊。鏈接或建議任何人?環境路徑目錄迭代
這是我使用之前:
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;
}
這隻每次程序運行的「計算」,一旦事。它也不是線程安全的,但是,與環境無關。
這是我自己的代碼片段沒有先進的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
你的意思是從'PATH'與目錄的列表,以最終提取目錄?如果是這樣的話,你可以使用'boost :: split()',並使用':'作爲分隔符,將windows上的unix和';'使用。 – hmjd
@hmjd偉大的,這個作品!但是,從C++算法風格的角度來看,Boost的'split_iterator'更加優雅。謝謝。請參閱http://www.boost.org/doc/libs/1_49_0/doc/html/string_algo/usage.html#id3183933 –