std::filesystem::remove 删除单个文件或空目录,不递归且失败抛 filesystem_error;remove_all 则递归删除整个目录树,返回删除路径数,易误删且不支持 dry-run。

用 std::filesystem::remove 删除单个文件或空目录
直接删文件或空文件夹,用 std::filesystem::remove 最稳妥。它不递归,只作用于目标本身,失败时抛出 std::filesystem::filesystem_error(比如权限不足、路径不存在、非空目录)。
常见错误现象:remove("data/") 对非空目录返回 false,但很多人没检查返回值,误以为删除成功;Windows 下对正在被程序打开的文件调用会失败,错误码通常是 ACCESS_DENIED。
- 必须包含
头,并链接-lstdc++fs(GCC 早期版本)或启用 C++17 标准(-std=c++17) - 路径建议用
std::filesystem::path构造,避免手动拼接斜杠问题:例如std::filesystem::remove(std::filesystem::path{"logs"} / "old.log") - 删除前可先用
exists()和is_regular_file()或is_empty()判断,避免无意义调用
std::filesystem::remove_all 会递归删除整个目录树
remove_all 是 remove 的“暴力版”:遇到目录就逐层删掉所有子项,最后删目录本身。它返回被删除的路径数量(含自身),0 表示什么都没删(路径不存在或无权限)。
容易踩的坑:remove_all("temp") 会清空整个 temp 目录,包括子目录、隐藏文件、只读文件——如果没提前确认,极易误删。某些系统(如 Windows)对只读文件默认拒绝删除,此时 remove_all 中途失败并停止,已删部分不可逆。
- 若需跳过只读文件,得自己遍历 +
permissions(path, perms::owner_write)先改权限再删 - 没有内置的“模拟删除”或 dry-run 模式,务必在调用前打印或日志记录完整路径:
std::cout - 跨平台注意:Linux 下符号链接会被当作普通文件删除(不追踪目标),而 Windows 的 junction 或 symlink 行为依赖创建方式,结果可能不一致
_remove 不是标准 C++ 函数,别用
你在某些老代码或 Windows SDK 文档里看到的 _remove,其实是 Microsoft CRT 的私有扩展(对应 POSIX 的 unlink),不是 ISO C++ 标准函数。它只删文件,不支持目录,且带下划线前缀表明它是实现细节,随时可能变更或移除。
典型误用:#include 后调用 _remove("config.txt") —— 这在 MinGW 或 Clang/LLVM 环境下根本编译不过;即使在 MSVC 下工作,也和 std::filesystem::remove 行为不一致(比如不抛异常、返回 int 错误码)。
- 替代方案只有两个:标准的
std::filesystem::remove(推荐),或 POSIX 的unlink()(仅限类 Unix,需) - 不要混用:
_remove和std::filesystem路径处理逻辑不同,比如对宽字符路径支持完全割裂 - 项目若需兼容旧编译器(如 GCC boost::filesystem::remove 作垫片,而非退化到 CRT 私有函数
删除失败时怎么查原因
标准库抛出的 std::filesystem::filesystem_error 包含三要素:错误消息、路径、底层系统错误码(.code().value())。别只打印 what(),要拆开看。
常见系统错误码含义:2(No such file or directory)、13(Permission denied)、16(Device or resource busy,Linux 常见于挂载点或 mmap 文件)、5(Access is denied,Windows 典型权限问题)。
- 捕获异常后,用
e.code().category() == std::system_category()确认是系统级错误 - Windows 下若删不了,检查是否被资源管理器预览窗格、杀毒软件、或自己进程的
fopen/CreateFile持有句柄 - Linux 下用
lsof +D /path/to/dir查哪些进程占着目录里的文件
实际删东西永远比看起来复杂:权限、并发访问、符号链接循环、只读属性……这些都不是函数签名能告诉你的。写删除逻辑前,先想清楚“这个路径是不是我真能动的”,比选哪个函数重要得多。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











