Linux上C中的递归文件删除

Jim*_*Jim 12 c unix

我有一个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;

}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我太害怕在生产中实际使用它.我确定我做错了什么.有没有人知道一个C库做递归删除我错过了,或者有人能指出我犯的任何错误?

谢谢.

nin*_*alj 13

POSIX有一个名为ftw(3)(文件树行走)的函数

遍历目录dirpath下的目录树,并为树中的每个条目调用一次fn().

  • `nftw`就是你所追求的 - 见[对同一个问题的答案](http://stackoverflow.com/questions/3184445/how-to-clear-directory-contents-in-c-on-linux-基本上,我想学的to-do-RM-RF/3184915#3184915). (4认同)
  • 还有新的FTW功能 - [nftw](http://www.opengroup.org/onlinepubs/9699919799/functions/nftw.html),界面略有不同. (3认同)

Kev*_*imm 1

幸好被吓死了,在这种情况下这是一种健康的态度。

我没有建议的库,在这种情况下你有两个选择:

1) 彻底“运行”此代码
  a) 不在机器上;在纸上,用铅笔。获取现有的目录树,列出所有元素并通过每个步骤运行程序,验证其是否有效
  b) 编译代码,但将所有删除调用替换为执行 printf 的行 - 验证它是否执行了应该执行的操作
  c) 重新插入删除调用并运行

2)使用你原来的方法(调用system())