在Linux上使用C检查目录是否为空

fre*_*ker 14 c linux directory

这是在C中检查目录是否为空的正确方法吗?有没有更有效的方法来检查空目录,特别是如果它有1000个文件,如果不是空的?

int isDirectoryEmpty(char *dirname) {
  int n = 0;
  struct dirent *d;
  DIR *dir = opendir(dirname);
  if (dir == NULL) //Not a directory or doesn't exist
    return 1;
  while ((d = readdir(dir)) != NULL) {
    if(++n > 2)
      break;
  }
  closedir(dir);
  if (n <= 2) //Directory Empty
    return 1;
  else
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果它是一个空目录,readdir将在条目''后停止.和'..'因此如果是空的n<=2.

如果它为空或不存在,则应返回1,否则返回0

更新:

@c$ time ./isDirEmpty /fs/dir_with_1_file; time ./isDirEmpty /fs/dir_with_lots_of_files
0

real    0m0.007s
user    0m0.000s
sys 0m0.004s

0

real    0m0.016s
user    0m0.000s
sys 0m0.008s
Run Code Online (Sandbox Code Playgroud)

为什么与只有一个文件的文件相比,检查包含大量文件的目录需要更长时间?

cni*_*tar 8

是否有更有效的方法来检查空目录,特别是如果它有1000个文件,如果不是空的话

编写代码的方式与它有多少文件无关(break如果n> 2).所以你的代码最多使用5个调用.我认为没有办法(便携)让它更快.

  • readdir(3)是getdents(2)的前端函数.strace中的getdents()系统调用显示它尝试从目录中检索32768个条目,并检索到1175个条目.我想如果你继续使用readdir(3),你就不会解决这个问题.虽然getdents()联机帮助页说你最好不要看那个函数,如果你不关心可移植性,你可能想要使用那个函数. (4认同)