如何使用Boost正确解析~路径并在~/testUsr路径下创建文件
问题根因
~是Shell层面的用户主目录缩写语法,不属于文件系统可识别的原生路径,Boost.Filesystem不会自动展开这个缩写。直接传入"~/testUsr"字符串时,库会将~解析为当前工作目录下的普通文件夹名,最终就会在程序运行目录下生成名为~的错误目录,无法定位到真实的用户主目录。
修复方法
核心思路是先获取用户主目录的真实绝对路径,再拼接目标子目录testUsr,不要直接使用带~的路径字符串。
方法1:兼容所有Boost版本,跨平台实现
通过读取系统环境变量拿到家目录路径,类Unix系统(Linux/macOS)的家目录存放在HOME环境变量,Windows系统存放在USERPROFILE环境变量,同时用Boost.Path的/运算符做路径拼接,自动适配不同系统的路径分隔符,避免手动拼字符串带来的分隔符错误:
#include <boost/filesystem.hpp> #include <cstdlib> boost::filesystem::path get_user_home() { char* home = nullptr; #ifdef _WIN32 home = std::getenv("USERPROFILE"); #else home = std::getenv("HOME"); #endif // 可根据业务需求加环境变量读取失败的兜底逻辑 return boost::filesystem::path(home ? home : "."); } // 原有业务逻辑修改后 void init_config(const std::string& filename) { boost::filesystem::path dir_path = get_user_home() / "testUsr"; if (!boost::filesystem::exists(dir_path)) { boost::filesystem::create_directories(dir_path); } boost::filesystem::path file_path = dir_path / (filename + ".ini"); if (!boost::filesystem::exists(file_path)) { boost::filesystem::ofstream out_file(file_path); config.WriteConfigFile(file_path.string()); out_file.close(); } }
方法2:高版本Boost内置接口(Boost 1.58+)
如果你的项目使用的Boost版本大于等于1.58,可以直接调用库内置的home_directory()接口获取家目录,不需要自己读取环境变量,代码更简洁:
#include <boost/filesystem.hpp> void init_config(const std::string& filename) { boost::filesystem::path dir_path = boost::filesystem::home_directory() / "testUsr"; if (!boost::filesystem::exists(dir_path)) { boost::filesystem::create_directories(dir_path); } boost::filesystem::path file_path = dir_path / (filename + ".ini"); if (!boost::filesystem::exists(file_path)) { boost::filesystem::ofstream out_file(file_path); config.WriteConfigFile(file_path.string()); out_file.close(); } }
额外提示
- 尽量避免手动用
+拼接路径字符串,用path类重载的/运算符拼接路径会自动处理不同系统的分隔符差异,减少路径错误。 - 如果项目已经支持C++17及以上标准,可以直接使用标准库
<filesystem>的对应接口,逻辑和Boost版本完全一致,无需额外依赖Boost。
内容的提问来源于stack exchange,提问作者xinxin wan
相关产品推荐
相关产品推荐

