c++17_filesystem
在 C++17 引入的 <filesystem> 库中,核心功能围绕几个关键类和函数展开,其中最常用的类(及相关组件)如下:
1. std::filesystem::path
- 表示文件路径类,用于 构造 ,拼接,分解 和 装换 。
构造 :
#include <filesystem>
#include <iostream>
#include <string>
namespace fs = std::filesystem;
int main() {fs::path p1("./test"); // 相对路径(当前目录下的test)fs::path p2("/home/user/doc"); // 绝对路径(Unix-like系统)fs::path p3("C:\\Windows\\System32"); // 绝对路径(Windows系统,注意转义符)// 字符串对象初始化std::string str = "data/file.txt";fs::path p4(str); // 从std::string构造std::cout << p1.string() <<'\n' << p2.string() << '\n' << p3.string() << '\n' << p4.string() << std::endl;
}
输出 :
./test
/home/user/doc
C:\Window\System32
data/file.txt
拼接 :
- 过运算符
/或者/=直接拼接
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {fs::path p1 = "C:";fs::path p2 = "System32";fs::path p3 = "file.txt";fs::path p4 = p1 / p2 / p3; // windows下自动装换为 '\'std::cout << p4.string() << std::endl; // C:System32\file.txt// 字面量的拼接fs::path path = fs::path("D:") / "soft" / ".." / "." / "exe"; // 会自动解析 ".."(上一级目录) 和 "."(本级目录)std::cout << path.string() << std::endl; // D:soft\..\.\exe
}
- 注意 : 不能用在相对路径后面加绝对路径, 会被覆盖
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {fs::path p1 = "C:";fs::path p2 = "System32";std::cout << p2 / p1 << std::endl; // "C:"
}
- 通过
append
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {fs::path p1 = "C:";p1.append("System32").append("file.txt"); // 链式调用std::cout << p1 << std::endl; // "C:System32\\file.txt"
}
分解 :
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {fs::path full_path = fs::path("C:") / "User" / "user" / "file.txt";// 路径分解std::cout << "文件名: " << full_path.filename() << '\n'; // 文件名: "file.txt"std::cout << "文件名(无扩展名): " << full_path.stem() << '\n'; // 文件名(无扩展名) : "file"std::cout << "扩展名: " << full_path.extension() << '\n'; // 扩展名 : ".txt"std::cout << "父目录: " << full_path.parent_path() << '\n'; // 父目录 : "C:User\\user"
}

2. std::filesystem::directory_iterator 和 std::filesystem::recursive_directory_iterator 目录迭代类
非递归遍历目录 std::filesystem::directory_iterator
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {fs::path full_path = fs::path("C:");for (const auto& entry : fs::directory_iterator(full_path)) {std::cout << entry.path() << std::endl;}
}

递归遍历目录 std::filesystem::recursive_directory_iterator
- 支持通过
disable_recursion_pending()临时禁止进入某个子目录。
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;int main() {// 递归遍历当前目录fs::recursive_directory_iterator it(".");fs::recursive_directory_iterator end;for (; it != end; ++it) {const auto& entry = *it; // 获取当前目录条目fs::path p = entry.path();// 若当前条目是目录,且名为 "x64",则跳过其递归遍历if (entry.is_directory() && p.filename() == "x64") {std::cout << "跳过目录: " << p << '\n';it.disable_recursion_pending(); // 关键调用:禁止进入该目录}else {std::cout << "遍历: " << p << '\n';}}return 0;
}

3. std::filesystem::directory_entry
- 表示目录中的一个 “条目” ,由目录迭代类返回
4 . std::filesystem::filesystem_error 异常类
- 包含错误发生的路径信息(通过
path1()、path2()获取)。 - 可通过
code()获取错误码(std::error_code)。
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;int main() {fs::path path = fs::path("C:\\Windows\\test");try {fs::create_directory(path);}catch (const fs::filesystem_error& e) {std::cerr << "错误: " << e.what()<< " 路径: " << e.path1() << '\n';}return 0;
}

5 . 其他函数

