为啥我的文件/目录操作在 Windows 上运行良好,但在 Linux 上却不行?

Posted

技术标签:

【中文标题】为啥我的文件/目录操作在 Windows 上运行良好,但在 Linux 上却不行?【英文标题】:Why does my file/dir manipulation works fine on Windows but not on Linux?为什么我的文件/目录操作在 Windows 上运行良好,但在 Linux 上却不行? 【发布时间】:2017-02-09 09:47:40 【问题描述】:

我正在尝试在目录名称“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++ 新手,这看起来很典型。

【问题讨论】:

为什么要在 尝试创建目录之后替换反斜杠? Windows 使用反斜杠,Linux 使用正斜杠...***.com/questions/38428561/… 检查你该死的返回值。 @CMouse 可能是,您应该将标题更改为“为什么我的文件/目录操作在 Windows 上运行良好,但在 Linux 上却不行?”否则,有人可能会建议您阅读How do I ask a good question?... 谢谢@Scheff 我会做的 【参考方案1】:

是的,有Boost.Filesystem 库,它有create_directory 函数。您最好使用它,因为它可以更恰当地处理不同的分隔符(例如 /\),而不仅仅是不时替换字符串中的字符。

要存储路径,您应该使用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。

【讨论】:

以上是关于为啥我的文件/目录操作在 Windows 上运行良好,但在 Linux 上却不行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 C 语言中的 SIMD 示例代码可以用 minGW 编译,但可执行文件不能在我的 Windows 机器上运行?

为啥我的exe文件没有在其他电脑上运行? [调试]

为啥我的chm文件打不开

Windows中为啥采用树形目录结构管理文件?

为啥我的 x64 程序在 Windows 上静默崩溃?

在 Windows 上使用 C++ 中的 system(),为啥调用另一个目录中的程序需要两个引号?