为什么我的文件/目录操作在Windows上运行正常但在Linux上运行不正常?

时间:2017-02-09 09:47:41

标签: c++ linux windows

我正在尝试使用目录名“IPM”创建一个处理会话的文件,即我的项目名称。

每次用户登录并注销时都会访问此文件,而且我还会在更多地方访问它,因此我创建了此函数来创建路径字符串,以便在不同的操作系统上创建文件

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上创建,但不在Linux上创建。

有什么方法可以通过boost来实现,因为我是C ++的新手,这看起来很典型。

1 个答案:

答案 0 :(得分:1)

是的,有Boost.Filesystem个库,具有create_directory功能。您最好使用它,因为它可以更好地处理不同的分隔符(例如/ vs \),而不仅仅是更换字符串中的字符。

要存储路径,您应该使用可以从boost::filesystem::pathchar*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