![](/img/trans.png)
[英]My program crashes on the Windows machine yet it works fine on the Linux
[英]Why does my file/dir manipulation works fine on Windows but not on Linux?
我正在尝试创建一个文件来处理会话,目录名称为“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 上创建。
有没有办法通过提升来做到这一点,因为我是 C++ 的新手,这看起来很典型。
是的,有Boost.Filesystem
库,它具有create_directory
功能。 您最好使用它,因为它可以更正确地处理不同的分隔符(例如/
vs \\
),而不仅仅是不时替换字符串中的字符。
要存储路径,您应该使用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 的更完整教程可在此处获得。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.