c++oding="utf-8" ?>
std::filesystem::remove仅删除单个文件或空目录,不递归;传入非空目录时返回false且不抛异常,必须检查返回值;删除非空目录应使用std::filesystem::remove_all。

用 std::filesystem::remove 删除单个文件或空目录
它只删目标本身,不递归。如果传入的是非空目录,直接返回 false(C++17 起),且不抛异常——这点容易被忽略,导致误以为删除成功。
常见错误现象:remove("my_dir") 返回 false,但没检查返回值,后续逻辑继续执行,结果出错。
- 必须检查返回值:
if (!fs::remove(path)) { /* 处理失败 */ } - 对文件和空目录行为一致:成功则返回
true,否则false - 路径不存在、权限不足、正在被占用时都返回
false,不区分具体原因
用 std::filesystem::remove_all 安全删非空目录
这才是删整个目录树的正确函数。它会递归删除所有子项,最后删掉目录本身。但要注意:它不保证原子性,中途失败时部分子项可能已被删,状态不可逆。
使用场景:清理临时目录、卸载插件数据、测试后清环境。
- 返回值是已删除的项数(
std::uintmax_t),失败时为0;但同样不报具体错误,需配合异常模式或std::error_code参数捕获细节 - 推荐带
std::error_code用法:fs::remove_all(path, ec),避免异常中断流程 - Windows 下若目录内有只读文件,
remove_all默认失败;可先用fs::permissions改写权限再删
删之前务必确认路径合法性与权限
std::filesystem 不做路径净化,也不会自动拒绝危险路径(如 "../etc/passwd")。一切依赖调用方校验。
管理和控制 macOS 系统功能。包括查看系统信息、管理进程、控制音量/亮度、 网络管理、电源管理、截图、剪贴板、Finder 操作等。当用户要求查看系统状态、 控制系统设置、管理进程、截图、调节音量亮度、查看网络信息、 关机重启睡眠等 Mac 系统操作时使用。
容易踩的坑:用户输入路径未经处理就传给 remove_all,导致越界删除。
- 用
fs::canonical(path)或fs::absolute(path)转成绝对路径后再比对根目录范围 - 检查是否在允许前缀下:
path.is_relative() || path.parent_path().string().starts_with(allowed_root) - Linux/macOS 注意符号链接:默认跟随(
remove_all会删链接指向的目标),如需删链接本身,得先is_symlink()判断
跨平台兼容性注意点
C++17 标准库的 std::filesystem 在 MSVC 2019 16.10+、GCC 8.1+、Clang 7.0+ 才完整支持。老版本可能缺实现或行为不一致。
性能影响:Windows 上 remove_all 比 Linux 慢,尤其含大量小文件时,因 NTFS 元数据操作开销大。
- GCC 早期版本(-lstdc++fs,否则链接失败
- MinGW-w64 部分构建默认禁用
std::filesystem,要加-D_GLIBCXX_FILESYSTEM_IS_ENABLED - 调试时建议加
fs::status(path)查类型和权限,避免误判is_directory或is_regular_file
实际删非空目录,核心就三步:校验路径 → 改写必要权限 → 调用 remove_all 并检查 error_code。少一步都可能静默失败或删错地方。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










