【发布时间】:2011-04-19 12:21:11
【问题描述】:
我有一个 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 库来执行我错过的递归删除,或者有人能指出我犯的任何错误吗?
谢谢。
【问题讨论】:
-
实际上,当您将某些内容传递给 shell 时,它会进入操作系统并以机器代码运行。 Unix 内核经过了极大的优化,因此即使您完全按照 Unix 内核中的编码方式对其进行编码,您也可能只会看到 5-10% 的性能提升。传递给 shell 太简单方便了。
-
有趣:
remove()的 POSIX 规范在非目录(文件、符号链接等)上表示unlink(),在目录上表示rmdir()。您应该检查remove()是否有效 - 如果没有,请报告。您应该看看如果函数的参数不是目录会发生什么 - 它抱怨它无法打开目录(但没有说哪个;这也很糟糕),然后无论如何都将其删除(或尝试)。