此问题在此处已有答案:
Removing a non empty directory programmatically in C or C++(9个答案)
6年前关闭。
我对非递归情况最感兴趣,但我猜其他可能跟踪这个问题的人更喜欢看到递归情况。
基本上,我们的目标是实现:
rm -rf <target>
字符串
然而,系统调用将是一个不成熟的答案。
此问题在此处已有答案:
Removing a non empty directory programmatically in C or C++(9个答案)
6年前关闭。
我对非递归情况最感兴趣,但我猜其他可能跟踪这个问题的人更喜欢看到递归情况。
基本上,我们的目标是实现:
rm -rf <target>
字符串
然而,系统调用将是一个不成熟的答案。
6条答案
按热度按时间vtwuwzda1#
使用
nftw()
(File Tree Walk)函数,带有FTW_DEPTH
标志。提供一个回调函数,只对传递的文件调用remove()
:字符串
f0brbegy2#
1.您需要使用
nftw()
(也可能是ftw()
)来遍历层次结构。1.您需要使用
unlink()
删除文件和其他非目录。1.您需要使用
rmdir()
删除(空)目录。你最好使用
nftw()
(而不是ftw()
),因为它提供了像FTW_DEPTH
这样的控件,可以确保在访问目录本身之前访问目录下的所有文件。rjee0c153#
您可以在纯C语言上编写自己的实现命令**“rm -rf”。源代码仅基于头文件:direent.h、sys/stat.h和unistd.h**。如果您需要将代码移植到其他系统,例如Windows,您只需更改具有相应功能的头文件,同时算法不会更改。
一个文件rmtree.c
字符串
查看。
我正在使用shell脚本生成文件/文件夹结构。
型
运行脚本
型
生成文件/文件夹结构
型
通过GCC构建文件rmtree. c的源代码
型
删除目录dir 1/dir1.1
型
删除目录dir 1/dir1.2
型
删除目录dir 1/
型
删除目录dir 2/dir2.2/dir2.2.2
型
删除目录dir 2/
型
删除目录dir 3/dir3.1
型
删除目录dir 3
型
删除目录dir 4
型
删除空目录dir 5
如果传递的路径不存在或不是目录的路径,您将看到下一个:
查看结果
测试环境
hfyxw5xn4#
我刚刚破解了GNU rm源代码,看看它到底是做什么的:
http://www.gnu.org/software/coreutils/
rm依靠以下职能:
字符串
在Linux和Mac上都有手册页。
e5njpo685#
请参阅
man 2 unlink
和man 2 rmdir
,了解将分别删除文件和(空)目录的系统调用。为了处理递归情况,您需要做的就是以后序深度优先遍历目标目录,并使用正确的删除例程按该顺序删除每个条目。您可以使用opendir
,readdir
,和closedir
来遍历目录结构。bvjveswy6#
在伪代码中,下面是我将采用的非递归方法:
字符串
我将把在C中实现这个作为读者的练习。
(Edit:此外,除非这纯粹是一个学习练习,否则不要重新发明这个轮子--像其他人建议的那样使用ftw或nftw会容易得多,因此不太容易出错。)