我有一个C程序,在程序的某个时刻有这样一个代码块:
system("rm -rf foo");
假设 foo 是一个目录。我决定不使用调用系统的方式,而是在代码中实现递归删除,因为这样会更好。我认为能够找到一个完成此操作的代码片段很容易。可惜我错了。最终,我写了下面的代码:
#include <stdio.h>
#include <sys/stat.h>
#include <dirent.h>
#include <libgen.h>
int recursiveDelete(char* dirname) {
DIR *dp;
struct dirent *ep;
char abs_filename[FILENAME_MAX];
dp = opendir (dirname);
if (dp != NULL)
{
while (ep = readdir (dp)) {
struct stat stFileInfo;
snprintf(abs_filename, FILENAME_MAX, "%s/%s", dirname, ep->d_name);
if (lstat(abs_filename, &stFileInfo) < 0)
perror ( abs_filename );
if(S_ISDIR(stFileInfo.st_mode)) {
if(strcmp(ep->d_name, ".") &&
strcmp(ep->d_name, "..")) {
printf("%s directory\n",abs_filename);
recursiveDelete(abs_filename);
}
} else {
printf("%s file\n",abs_filename);
remove(abs_filename);
}
}
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
remove(dirname);
return 0;
}
这似乎可以工作,但我太害怕在生产环境中实际使用它。我肯定做错了什么。在C语言中有没有递归删除的方法我错过了吗?或者有人能指出我犯的任何错误吗?
remove()
函数对于非目录(文件、符号链接等)使用unlink()
,对于目录则使用rmdir()
。 你应该检查remove()
函数是否正常工作,并在出现问题时进行报告。你应该看看如果函数的参数不是目录会发生什么 - 它会抱怨无法打开目录(但不说是哪一个;这也很糟糕),然后无论如何都会删除它(或尝试删除)。 - Jonathan Leffler