c++如何利用C++17的filesystem::copy实现高效的文件夹克隆【实战】

秋涛姑娘_4622

秋涛姑娘_4622

2026-03-27

428人浏览

原创

默认不会递归复制子目录;需显式指定fs::copy_options::recursive才进入子目录,配合overwrite_existing可覆盖同名文件,但权限、时间戳等元数据需手动同步,windows长路径需系统级配置支持。

c++如何利用c++17的filesystem::copy实现高效的文件夹克隆【实战】

filesystem::copy 会递归复制子目录吗?

默认不会。直接调用 filesystem::copy(src, dst) 对目录只做“浅拷贝”——即创建同名空目录,不复制任何内容,还可能抛出 filesystem::filesystem_error(错误码为 not_supported 或 is_a_directory)。这是新手最常卡住的第一步。

必须显式传入 copy_options::recursive 才触发递归行为:

fs::copy(src_dir, dst_dir, fs::copy_options::recursive);

但注意:这仍不是“克隆”,它默认会跳过已存在的同名文件(不覆盖),也不处理符号链接、权限、最后访问时间等元数据。

如何让 copy 真正“克隆”而非“同步”?

克隆要求目标完全一致:覆盖已有文件、保留权限、不忽略隐藏项、不因路径存在而中断。关键靠组合 copy_options 标志位:

  • fs::copy_options::recursive —— 进入子目录
  • fs::copy_options::overwrite_existing —— 覆盖目标中同名文件/目录
  • fs::copy_options::skip_symlinks(可选)—— 避免把符号链接本身当普通文件复制(否则会复制目标文件内容)
  • fs::copy_options::copy_symlinks(可选)—— 若需原样保留符号链接结构

典型克隆调用:

fs::copy(src, dst, fs::copy_options::recursive | fs::copy_options::overwrite_existing);

⚠️ 注意:overwrite_existing 对目录无效(目录无法“覆盖”,只能先删后建),所以若 dst 已存在且是目录,copy 会尝试向其中合并内容;如需严格“清空再写”,得手动 fs::remove_all(dst) 再 copy。

权限、时间戳、符号链接这些元数据能一并复制吗?

不能。C++17 的 filesystem::copy 只复制文件内容和基础权限(由 OS 默认 umask 或目标父目录决定),不复制 last_write_time、last_access_time、所有权(owner/group)、ACL 或扩展属性。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

如果你需要完整克隆(比如备份或部署场景),得自己补全:

  • 用 fs::last_write_time(src_entry, fs::last_write_time(dst_entry)) 同步修改时间
  • 用 fs::permissions(dst_path, fs::status(src_path).permissions()) 恢复权限位
  • 对符号链接,先判断 fs::is_symlink(src_entry),再用 fs::read_symlink() + fs::create_symlink()

这些操作必须在 copy 完成后遍历目标树执行,且要注意顺序:先改权限,再改时间,否则某些系统会重置时间戳。

Windows 下路径长度超 260 字符怎么办?

默认情况下,Windows API 会拒绝长路径,导致 filesystem::copy 抛出异常,错误信息类似 The system cannot find the path specified(即使路径真实存在)。

解决方案只有两个:

  • 在程序启动时调用 SetCurrentDirectory(L"\\?\C:\full\path") 切换到长路径根目录下(需 Unicode 版本)
  • 更可靠的是:编译前定义 _HAS_AUTO_PTR_ETC 1 并确保使用 VS2019+,同时在项目属性中启用“启用 Windows Long Path Support”(即清单中添加 longPathAware=true)

纯 C++ 标准库无绕过方案,filesystem 底层仍走 Win32 API。Linux/macOS 无此限制。

实际克隆逻辑里,长路径问题往往在递归深处才暴露,建议在 copy 前先用 fs::exists() 和 fs::status() 预检关键路径,比等崩溃再查更省事。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3239

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2818

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1488

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2579

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3290

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1617

3

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2023.08.28

2497

4

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.30

4907

5

Window.setInterval()方法
Window.setInterval()方法

Window.setInterval() 方法的基本语法是“window.setInterval(function, delay)”,function是要重复执行的函数或代码块,delay是每次执行之间的时间间隔,以毫秒为单位。本专题为大家提供Window.setInterval()相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

735

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习