跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++17 文件系统
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++17文件系统 = == 介绍 == C++17引入了'''<filesystem>'''库(正式名称为'''std::filesystem'''),提供了一套跨平台的文件和目录操作接口。该库基于Boost.Filesystem,允许开发者以统一的方式处理文件路径、遍历目录、检查文件属性以及执行文件操作(如复制、移动和删除)。 文件系统库的核心目标是: * 提供'''平台无关'''的路径表示 * 支持'''递归目录遍历''' * 实现'''文件元数据查询'''(如大小、权限、类型) * 封装常见文件操作(如创建/删除目录) == 核心组件 == 文件系统库主要包含以下类和函数: {| class="wikitable" ! 组件 !! 描述 |- | <code>std::filesystem::path</code> || 表示文件系统路径的类 |- | <code>std::filesystem::directory_entry</code> || 目录项信息(缓存文件属性) |- | <code>std::filesystem::directory_iterator</code> || 非递归目录遍历器 |- | <code>std::filesystem::recursive_directory_iterator</code> || 递归目录遍历器 |- | <code>std::filesystem::file_status</code> || 文件类型和权限信息 |} == 基本用法 == === 路径操作 === <source lang="cpp"> #include <iostream> #include <filesystem> namespace fs = std::filesystem; // 命名空间别名 int main() { // 构造路径对象 fs::path p1 = "/usr/local/include"; fs::path p2 = "config.h"; // 路径拼接和规范化 fs::path full_path = p1 / p2; std::cout << "完整路径: " << full_path << '\n' << "父目录: " << full_path.parent_path() << '\n' << "文件名: " << full_path.filename() << '\n' << "扩展名: " << full_path.extension() << '\n'; // 路径存在性检查 if (fs::exists(full_path)) { std::cout << "文件存在\n"; } } </source> '''输出示例'''(Linux系统): <pre> 完整路径: "/usr/local/include/config.h" 父目录: "/usr/local/include" 文件名: "config.h" 扩展名: ".h" 文件存在 </pre> === 文件操作 === <source lang="cpp"> #include <filesystem> #include <iostream> namespace fs = std::filesystem; void demo_file_ops() { fs::path demo_dir = "test_dir"; // 创建目录 if (!fs::exists(demo_dir)) { fs::create_directory(demo_dir); std::cout << "目录创建成功\n"; } // 创建空文件 fs::path file1 = demo_dir / "data.txt"; std::ofstream(file1).put('a'); // 创建文件并写入一个字符 // 文件信息 std::cout << "文件大小: " << fs::file_size(file1) << " bytes\n" << "最后修改时间: " << fs::last_write_time(file1).time_since_epoch().count() << '\n'; // 复制文件 fs::path file2 = demo_dir / "data_backup.txt"; fs::copy_file(file1, file2); // 删除操作 fs::remove(file1); fs::remove_all(demo_dir); // 递归删除目录 } </source> == 高级特性 == === 目录遍历 === 递归遍历目录结构(使用mermaid展示流程): <mermaid> graph TD A[开始遍历] --> B[打开目录] B --> C{是否还有条目?} C -->|是| D[获取当前条目] D --> E[处理文件/目录] E --> F[递归处理子目录?] F -->|是| B F -->|否| C C -->|否| G[结束遍历] </mermaid> 代码实现: <source lang="cpp"> void list_files(const fs::path& dir_path) { try { for (const auto& entry : fs::recursive_directory_iterator(dir_path)) { auto status = entry.status(); std::cout << (fs::is_directory(status) ? "[D] " : fs::is_symlink(status) ? "[L] " : "[F] ") << entry.path() << '\n'; } } catch (const fs::filesystem_error& e) { std::cerr << "错误: " << e.what() << '\n'; } } </source> === 文件系统空间 === 查询磁盘空间信息: <source lang="cpp"> void show_disk_usage(const fs::path& path) { fs::space_info si = fs::space(path); std::cout << "在 " << path << ":\n" << "总空间: " << si.capacity/1'000'000 << " MB\n" << "可用空间: " << si.available/1'000'000 << " MB\n" << "空闲空间: " << si.free/1'000'000 << " MB\n"; } </source> == 错误处理 == 文件系统操作可能抛出<code>std::filesystem::filesystem_error</code>异常,最佳实践是: * 检查文件存在性(<code>exists()</code>) * 捕获特定异常 * 使用<code>error_code</code>参数的无异常版本 示例: <source lang="cpp"> void safe_remove(const fs::path& p) { std::error_code ec; if (!fs::remove(p, ec)) { std::cerr << "删除失败: " << ec.message() << '\n'; } } </source> == 实际应用案例 == '''场景:''' 实现一个简单的项目清理工具,删除构建目录中的所有临时文件(*.tmp, *.bak) <source lang="cpp"> void clean_project(const fs::path& project_dir) { const std::vector<std::string> ext_to_remove = {".tmp", ".bak"}; for (const auto& entry : fs::recursive_directory_iterator(project_dir)) { if (!entry.is_regular_file()) continue; const std::string ext = entry.path().extension().string(); if (std::find(ext_to_remove.begin(), ext_to_remove.end(), ext) != ext_to_remove.end()) { std::cout << "删除: " << entry.path() << '\n'; fs::remove(entry.path()); } } } </source> == 跨平台注意事项 == * Windows路径使用反斜杠(<code>\</code>),但<code>path</code>类会自动处理 * 符号链接行为在不同系统上可能不同 * 文件权限模型在Unix和Windows上有显著差异 == 性能考虑 == * <code>directory_entry</code>会缓存文件属性,减少重复系统调用 * 递归遍历可能消耗较多内存,对于超大目录结构 * 频繁调用<code>last_write_time</code>等函数可能影响性能 == 数学表示 == 文件系统空间计算可用百分比公式: <math> \text{可用百分比} = \left( \frac{\text{available}}{\text{capacity}} \right) \times 100\% </math> == 总结 == C++17文件系统库提供了: * 统一的跨平台路径处理 * 完整的文件和目录操作集合 * 类型安全的接口设计 * 异常和错误码双重错误处理机制 对于需要文件操作的现代C++项目,应优先使用<code>std::filesystem</code>而非平台特定API。 [[Category:编程语言]] [[Category:C++]] [[Category:C++141720 特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)