如何删除C或C++中的非空目录?有什么功能吗?rmdir只删除空目录.请提供一种不使用任何外部库的方法.

还告诉我如何删除C或C++文件?

推荐答案

您希望编写一个函数(递归函数最简单,但在深层目录上很容易耗尽堆栈空间),该函数将枚举目录的子目录.如果你发现一个子目录,你就会在这个目录上递归.否则,将删除其中的文件.完成后,目录为空,可以通过系统调用将其删除.

要枚举Unix上的目录,可以使用opendir()readdir()closedir().要删除,请在空目录中使用rmdir()(即在函数结束时,删除子目录后),在文件中使用unlink().注意,在许多系统上,struct dirent中的d_type成员不受支持;在这些平台上,必须使用stat()S_ISDIR(stat.st_mode)来确定给定路径是否为目录.

在Windows上,您将使用FindFirstFile()/FindNextFile()枚举,在空目录上使用RemoveDirectory(),在删除文件时使用DeleteFile().

下面是一个可能在Unix上工作的示例(完全未经测试):

int remove_directory(const char *path) {
   DIR *d = opendir(path);
   size_t path_len = strlen(path);
   int r = -1;

   if (d) {
      struct dirent *p;

      r = 0;
      while (!r && (p=readdir(d))) {
          int r2 = -1;
          char *buf;
          size_t len;

          /* Skip the names "." and ".." as we don't want to recurse on them. */
          if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, ".."))
             continue;

          len = path_len + strlen(p->d_name) + 2; 
          buf = malloc(len);

          if (buf) {
             struct stat statbuf;

             snprintf(buf, len, "%s/%s", path, p->d_name);
             if (!stat(buf, &statbuf)) {
                if (S_ISDIR(statbuf.st_mode))
                   r2 = remove_directory(buf);
                else
                   r2 = unlink(buf);
             }
             free(buf);
          }
          r = r2;
      }
      closedir(d);
   }

   if (!r)
      r = rmdir(path);

   return r;
}

C++相关问答推荐

在Intel HD图形上使用SPIR-V但在NVIDIA上不使用SPIR-V时,GLSL统一名称为空

两个看似相同的代码的不同行为

GCC不警告隐式指针到整数转换'

Malloc(sizeof(char[Length]))是否不正确?

为什么STM32G474RE上没有启用RCC PLL

Sizeof(&Q;字符串&Q;)的正确输出是什么?

为什么我会收到释放后堆使用错误?

X64:并发写入布尔数组

如何按顺序将所有CSV文件数据读入 struct 数组?

C I/O:在Windows控制台上处理键盘输入

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

如何使用libgpio(d)为Raspberry Pi编译C程序?

理解bzip2的BZ2_解压缩函数中的状态重新分配

为什么我在C代码中得到一个不完整的类型?

如何使用空元素块声明指针数组

Matlab/Octave对conv2函数使用哪种方法?

';malloc():损坏的顶部大小';分配超过20万整数后

从文件到链表读取日期

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

多行表达式:C 编译器如何处理换行符?