2017-02-09 33 views
1

我想創建一個文件來處理目錄名稱爲「IPM」的會話,即我的項目名稱。爲什麼我的文件/目錄操作可以在Windows上正常工作,但在Linux上不能正常工作?

我每次用戶登錄時訪問該文件,並退出再加上我也是在這樣,我創建了這個函數來創建一個路徑字符串一些地方訪問,以便在那裏是在不同的操作系統

創建的文件
std::string SessionManager::createPathString(std::string sFileName) 
{ 
    char* pPath = getenv(HOME); 
    std::string sUserName(pPath); 
    createDirectory(sUserName); 

    std::replace(sUserName.begin(), sUserName.end(), '\\', '/'); 

    sUserName.append("/IPM"); 
    sUserName.append("/"); 
    sUserName.append(sFileName); 

return sUserName; 
} 

我調用這個函數來得到我的文件路徑,並創建目錄的功能是這樣的

int createDirectory(std::string sUserName) 
{ 
    sUserName += "\\IPM"; 
#ifdef _WIN32 
    int ret = _mkdir(sUserName.c_str()); 
#elif __linux__ 
    int ret = mkdir(sUserName.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
#endif 
return ret; 
} 

它創建Windows上的目錄,但無法在Linux上,如果該目錄或文件不目前它在Windows上創建,但不在Linu上X。

有沒有什麼辦法可以通過提升來實現,因爲我是C++新手,看起來很典型。

+3

Boost.FileSystem – Danh

+0

爲什麼你要更換反斜槓_after_試圖創建目錄? – SingerOfTheFall

+0

Windows使用反斜槓和Linux使用正斜槓... http://stackoverflow.com/questions/38428561/difference-between-forward-slash-and-backslash-in-file-path – p0rter

回答

1

是的,有Boost.Filesystem庫,它有create_directory函數。你最好使用它,因爲它可以更好地處理不同的分隔符(比如/ vs \),而不僅僅是隨時替換字符串中的字符。

,以存儲路徑,你應該再使用boost::filesystem::path對象,從char*std::stringstd::wstring字符串創建了一個可以,然後追加使用operator /=,然後調用create_directory或任何其他方法,你需要:

using namespace boost::filesystem; 

path p(userName); 
p /= "IPM"; // By the way, you should make this constant, don't you? 
p /= sFileName; 
if (!create_directory(p)) { 
    cerr << "Failed to create directory"; 
} 

更完整Boost.Filesystem的教程可用here

相關問題