2017-02-09 1 views
1

"IPM"이라는 디렉토리 이름, 즉 프로젝트 이름을 사용하여 세션을 처리 할 파일을 만들려고합니다.Windows에서 파일/디렉토리 조작이 잘 작동하지만 Linux에서는 작동하지 않는 이유는 무엇입니까?

나는이 파일을 사용자가 로그인 할 때마다 액세스 로그 아웃 플러스 파일이 다른 OS

에 생성되는 위치에 있도록 나는 또한 이렇게 내가 경로 문자열을 만들려면이 기능을 만든 몇 가지 더 많은 장소에서 액세스
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; 
} 

같은 디렉토리를 생성하는 기능 간다를 얻기 위해이 함수를 호출 현재 그것이 창문에 만들어 지지만, Linu에는 만들어지지 않는다. 엑스.

부스트로 할 수있는 방법이 있나요? C++을 처음 접했을 때부터 그렇습니다.

+3

Boost.FileSystem – Danh

+0

왜 디렉토리를 만들려고 시도하기 전에 백 슬래시를 바꾸시겠습니까? – SingerOfTheFall

+0

Windows는 백 슬래시를 사용하고 linux는 전달 슬래시를 사용합니다 ... http : //stackoverflow.com/questions/38428561/difference-between-forward-slash-and-backslash-in-file-path – p0rter

답변

1

예, Boost.Filesystem 라이브러리가 있으며, 해당 라이브러리는 create_directory입니다. 때때로 문자열의 문자를 바꿀 때보 다 여러 구분 기호 (예 : /\)를보다 적절하게 처리 할 수 ​​있으므로이를 사용하는 것이 좋습니다. 저장 경로에

, 당신은 다음 boost::filesystem::path 객체, char*, std::string 또는 std::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입니다.

관련 문제