c++oding="utf-8" ?>
备份前须用std::filesystem::create_directories创建完整父目录,因copy_options::create_directories不递归创建多级父目录;时间戳需用std::chrono::file_clock::to_time_t转time_t再格式化,避免跨平台错误。

用 std::filesystem::copy 备份文件前,先确认目标目录存在
直接调用 std::filesystem::copy 时,如果目标路径的父目录不存在,它不会自动创建——哪怕加了 copy_options::create_directories,也只对「目标路径的直接父目录」生效,嵌套多级时容易失败。比如想备份到 "backup/2024-06-15/file.txt",但 "backup" 目录本身不存在,就会抛出 std::filesystem::filesystem_error。
实操建议:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先用
std::filesystem::create_directories显式创建完整目标路径的父目录(传入parent_path()) - 别依赖
copy_options::create_directories处理多级路径,它不递归保证上级全存在 - 加一层
try/catch捕获std::filesystem::filesystem_error,比崩溃强
时间戳命名必须手动拼接,std::filesystem 不提供格式化函数
std::filesystem::last_write_time 返回的是 file_time_type,本质是高精度时钟点(通常为纳秒级 duration),不能直接转成字符串。网上常见错误是试图用 time_t 强转再塞进 strftime,结果在 Windows 和 macOS 上行为不一致,甚至溢出。
实操建议:
- 用
std::chrono::file_clock::to_time_t转成time_t(C++20 起推荐,兼容性好) - 用
std::put_time+std::localtime或std::gmtime格式化,避免 C 风格函数的线程安全问题 - 命名建议用
"backup_20240615_142305.txt"这类无分隔符、可排序的格式,别用空格或冒号
示例片段:
auto now = std::chrono::file_clock::to_time_t(std::chrono::file_clock::now());<br>std::ostringstream oss;<br>oss <h3>覆盖备份时,<code>copy_options::overwrite_existing</code> 的实际行为要看源文件是否可读</h3> <p>这个 flag 只控制“目标已存在时是否覆盖”,但不会跳过权限检查。如果目标文件是只读的(比如 Windows 下被标记为 readonly 属性),即使写了 <code>overwrite_existing</code>,<code>copy</code> 仍会失败并抛异常——它不会自动清除只读属性。</p> <p>实操建议:</p>
- 备份前用
std::filesystem::permissions清掉目标路径的owner_write权限位(如果存在) - 或者改用先
remove再copy的组合,更可控 - 注意:
remove对只读文件也失败,所以得先permissions(..., perms::owner_write)
Windows 下路径分隔符混用可能触发 silent 失败
虽然 std::filesystem 内部会 normalize 路径,但如果你手拼路径时用了 "C:\data\file.txt" 和 "backup/file.txt" 混合风格,在某些旧版 libstdc++ 或 MinGW 构建环境下,copy 可能静默失败(不报错,也不写文件)。
实操建议:
- 统一用正斜杠
/拼接路径(std::filesystem完全支持) - 构造路径优先用
std::filesystem::path的/重载,而不是字符串拼接 - 调试时打印
target_path.generic_string()看最终路径是否符合预期
copy 调用前都该检查一次目标父目录和权限状态。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










