我想創建一個目錄path = "$HOME/somedir"
。如何在主目錄中創建文件夾?
我使用boost::filesystem::create_directory(path)
嘗試過,但失敗了 - 顯然函數不擴大系統變量。
我怎樣才能做到這一點最簡單的方法?
(注:在我的情況下,字符串path
是恆定的,我不知道,如果它包含變量)
編輯:我的工作在Linux上(雖然我計劃我的端口應用程序到Windows在不久的將來)。
我想創建一個目錄path = "$HOME/somedir"
。如何在主目錄中創建文件夾?
我使用boost::filesystem::create_directory(path)
嘗試過,但失敗了 - 顯然函數不擴大系統變量。
我怎樣才能做到這一點最簡單的方法?
(注:在我的情況下,字符串path
是恆定的,我不知道,如果它包含變量)
編輯:我的工作在Linux上(雖然我計劃我的端口應用程序到Windows在不久的將來)。
使用getenv獲得環境變量,包括HOME
。如果你不確定它們是否存在,你將不得不解析字符串來尋找它們。
您還可以使用系統shell和呼應,讓外殼爲你做這個。
GETENV是便攜式(從標準C),但使用的殼裏做這個便攜將是* nix中和Windows之間更難。環境變量的約定在* nix和Windows之間也不同,但是大概字符串是可以針對給定平臺修改的配置參數。
如果你只需要支持擴大主目錄,而不是隨意的環境變量,您可以使用~
約定,然後~/somedir
爲您的配置字符串:
std::string expand_user(std::string path) {
if (not path.empty() and path[0] == '~') {
assert(path.size() == 1 or path[1] == '/'); // or other error handling
char const* home = getenv("HOME");
if (home or ((home = getenv("USERPROFILE")))) {
path.replace(0, 1, home);
}
else {
char const *hdrive = getenv("HOMEDRIVE"),
*hpath = getenv("HOMEPATH");
assert(hdrive); // or other error handling
assert(hpath);
path.replace(0, 1, std::string(hdrive) + hpath);
}
}
return path;
}
這種行爲是從Python的os.path.expanduser複製,但它只處理當前用戶。儘管USERPROFILE
,HOMEDRIVE
和HOMEPATH
不太可能在Linux上設置,但通過檢查目標平臺而不是盲目嘗試不同的環境變量,可以改進平臺不可知的嘗試。
關閉我的頭頂,
namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
請參閱「在我的情況下,字符串路徑是恆定的,我不知道它是否包含變量」。另外,如果沒有設置HOME,您可能需要檢查getenv的返回值 - 這應該是非常罕見的,但最好是中止或以錯誤終止,而不是進入未定義的域。 – 2011-02-05 22:31:03
你在Linux或Windows的工作? – Nawaz 2011-02-03 20:07:19