首页 > 解决方案 > C - 在递归函数中 remove() 不起作用

问题描述

当我在目录 Folder/file.txt 上调用函数时,避免递归函数是否构造良好。这段代码应该删除 file.txt,但是当它到达

if (remove(actual->d_name) != 0 && rmdir(actual->d_name) != 0){

删除不起作用,我不知道为什么......

 void borrarrecursivo(DIR *directorio){

      struct dirent *actual;

          while(((actual = readdir(directorio)) != NULL) && (actual->d_name) != NULL){
            if ((strcmp(actual->d_name, ".") != 0) && (strcmp(actual->d_name, "..") != 0)){
              if (remove(actual->d_name) != 0 && rmdir(actual->d_name) != 0){
                  DIR *siguiente;
                  if ((siguiente = opendir(actual->d_name)) != NULL){
                    borrarrecursivo(siguiente);
                  }
              }
            }
          }
          closedir(directorio);
      //}
    }//fin borrarrecursivo

标签: clinux

解决方案


阅读 上的手册页readdir,它d_name文件名返回,而不是完整路径,而是remove期望rmdir完整路径(或相对于当前工作目录的条目)。

因此,每次对函数进行递归调用时,您都必须构建一条关于当前位置的新路径,并将其传递给递归调用。(我让你改变你的代码来实现这一点。)

注意:您还假设如果您既不能删除,也不能 rmdir,则它必须是一个目录并且您要递归。但它不必是目录。您应该检查该d_type字段。

注意:remove 的手册页说,如果名称是目录,它会调用 rmdir。因此调用 rmdir 是不必要的。


推荐阅读