[原创](Modern C++)现代C++的关键性概念: 文件系统标准库<filesystem>真心好用.
[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测
[序言]
随着C++17标准的推出, 其中<filesystem>库无疑是最受欢迎的一项. 过去在处理文件路径拼接、目录遍历等操作时常常需要依赖第三方库或者编写大量平台相关的代码. 而如今, std::filesystem不仅提供了统一的API来处理文件和目录操作, 还能自动管理不同平台的路径分隔符, 让代码更简洁、易读且具有更好的可移植性.
[代码演示]
int main()
{
// 定义根路径,这里以 Windows 平台的 D 盘为例
std::filesystem::path path_Root{ "D:\\" };
// 使用追加运算符(/))来拼接路径, 无需担心平台之间的路径分隔符差异
std::filesystem::path path_Full{ path_Root / "debug_tools" / "x64dbg_64Env" };
std::cout << path_Full.string().c_str() << std::endl; // 输出:D:\debug_tools\x64dbg_64Env
// 使用recursive_directory_iterator遍历目录及其子目录, 非常方便
try {
for (const auto& FileFolder_Item : std::filesystem::recursive_directory_iterator(path_Full)) {
std::cout << FileFolder_Item.path().string().c_str() << std::endl;
}
}
catch (const std::filesystem::filesystem_error& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
[代码说明]
1. 路径拼接:
* 使用std::filesystem::path定义了一个根路径path_Root(例如:D:\).
* 通过追加运算符 / 依次将"debug_tools"和"x64dbg_64Env"拼接到根路径上, 形成一个完整的文件夹路径path_Full. 这种方式可以自动处理路径分隔符, 无论是在Windows还是Linux平台下, 都能保证路径的正确性.
2. 目录遍历:
* 使用std::filesystem::recursive_directory_iterator对path_Full目录进行递归遍历. 这个迭代器可以自动遍历指定目录下的所有文件和子目录, 非常适合处理文件系统的层级结构.
* 在遍历过程中, 每一个目录或文件都会被输出. 通过FileFolder_Item.path().string().c_str()获取路径的字符串表示, 方便调试和日志记录.
3. 异常处理:
* 由于文件系统操作存在权限不足或路径错误等问题, 代码使用try-catch结构捕获std::filesystem::filesystem_error异常, 以便在出现错误时能够及时反馈并处理.
[总结]
可以看到<filesystem>库为现代C++提供了极大便利, 跨平台路径处理, 便捷的目录遍历, 健壮的异常处理. 不仅提升了代码的可读性和可移植性, 同时也为开发者带来了更高效、更安全的文件系统操作方式.