std::filesystem 是 C++17 引入的跨平台文件系统操作标准库,需 C++17 支持、包含 头文件并推荐使用 fs::path 类型与异常安全操作。
std::filesystem 是 C++17 引入的标准库模块,用于跨平台地操作文件和目录。它替代了过去依赖系统 API(如 Windows 的 FindFirstFile 或 POSIX 的 opendir)的繁琐写法,接口统一、语义清晰、异常安全。
使用前需确保编译器支持 C++17(如 GCC 8+、Clang 7+、MSVC 2017 15.7+),并在代码中:
#include
namespace fs = std::filesystem;(推荐别名,避免重复输入)-lstdc++fs(GCC 9+ 可能不再需要)fs::path 是核心类型,不是字符串容器,而是路径的逻辑表示,自动处理分隔符(/ 或 \)和编码细节。
fs::path p = "data/config.txt"; 或 fs::path p("logs") / "app.log";(/ 是重载的拼接操作符)fs::absolute(p)(基于当前工作目录)p.lexically_normal() 消除 ./、../ 等冗余部分p.parent_path()、p.filename()、p.extension()(返回 .txt)用 fs::status() 或快捷函数判断存在性与类型,避免竞态条件(检查后被删除):
fs::exists(p)
fs::is_regular_file(p)、fs::is_directory(p)、fs::is_symlink(p)
for (const auto& entry : fs::recursive_directory_iterator("src")) { ... }
fs::directory_iterator("build")(只扫一层)每个 directory_entry 支持 entry.path()、entry.is_directory()、entry.file_size() 等便捷访问。
所有操作默认抛出 fs::filesystem_error 异常(可传入 std::error_code& 参数转为错误码处理):
fs::create_directories("a/b/c");(自动创建中间不存在的目录)fs::copy_file("src.txt", "dst.txt", fs::copy_options::overwrite_existing);
fs::rename("old.txt", "new.txt");(原子操作,跨卷时为复制+删除)fs::remove("temp.log");
fs::remove_all("build/");
基本上就这些。用好 fs::path 和异常处理,就能写出健壮、可移植的文件操作代码。不复杂但容易忽略细节——比如路径拼接别用 +,要用 /;判断存在性后立刻操作,避免竞态;跨平台时慎用硬编码的分隔符。