c++如何删除文件或文件夹_remove与remove_all区别【指南】

陌涛大大_6019

陌涛大大_6019

2026-04-12

343人浏览

原创

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

c++如何删除文件或文件夹_remove与remove_all区别【指南】

用 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++ 标准函数。它只删文件,不支持目录,且带下划线前缀表明它是实现细节,随时可能变更或移除。

C++14
C++14

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

下载

典型误用:#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++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.07.26

3499

3

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

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

2023.07.27

3038

6

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

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

2023.08.01

1548

3

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

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

2023.08.02

2759

5

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

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

2023.08.08

3370

4

windows自动更新
windows自动更新

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

2023.08.10

1757

3

windows boot manager
windows boot manager

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

2023.08.28

2537

4

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

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

2023.08.30

5547

5

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

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

2023.08.31

875

3

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习