2011-02-03 110 views
6

我想創建一個目錄path = "$HOME/somedir"如何在主目錄中創建文件夾?

我使用boost::filesystem::create_directory(path)嘗試過,但失敗了 - 顯然函數不擴大系統變量。

我怎樣才能做到這一點最簡單的方法?

(注:在我的情況下,字符串path是恆定的,我不知道,如果它包含變量)

編輯:我的工作在Linux上(雖然我計劃我的端口應用程序到Windows在不久的將來)。

+2

你在Linux或Windows的工作? – Nawaz 2011-02-03 20:07:19

回答

14

使用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複製,但它只處理當前用戶。儘管USERPROFILEHOMEDRIVEHOMEPATH不太可能在Linux上設置,但通過檢查目標平臺而不是盲目嘗試不同的環境變量,可以改進平臺不可知的嘗試。

4

關閉我的頭頂,

namespace fs = boost::filesystem; 
fs::create_directory(fs::path(getenv("HOME"))); 
+1

請參閱「在我的情況下,字符串路徑是恆定的,我不知道它是否包含變量」。另外,如果沒有設置HOME,您可能需要檢查getenv的返回值 - 這應該是非常罕見的,但最好是中止或以錯誤終止,而不是進入未定義的域。 – 2011-02-05 22:31:03

相關問題