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

时间:2011-06-17 09:04:52

标签: 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;
}

如果它是一个空目录,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

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

4 个答案:

答案 0 :(得分:8)

  

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

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

答案 1 :(得分:3)

bool has_child(string path)
{
    if(!boost::filesystem::is_directory(path))
        return false;

    boost::filesystem::directory_iterator end_it;
    boost::filesystem::directory_iterator it(path);
    if(it == end_it)
        return false;
    else
        return true;
}

答案 2 :(得分:1)

https://en.cppreference.com/w/cpp/filesystem/is_empty

在最新的c ++中,我们可以使用上述链接的新api“ std :: filesystem :: is_empty”检查dir是否为空。

答案 3 :(得分:0)

也许这段代码可以帮到你:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    char cmd[1024];
    char *folder = "/tmp";
    int status, exitcode;

    if(argc == 2)
            folder = argv[1];

    snprintf(cmd, 1024, "test $(ls -A \"%s\" 2>/dev/null | wc -l) -ne 0", folder);
    printf("executing: %s\n", cmd);

    status = system(cmd);
    exitcode = WEXITSTATUS(status);

    printf ("exit code: %d, exit status: %d\n", exitcode, status);

    if (exitcode == 1)
            printf("the folder is empty\n");
    else
            printf("the folder is non empty\n");


    return 0;
}

使用ls -A文件夹2&gt; / dev / null |检查文件夹是否为空wc -l,计算文件夹中的文件,如果它返回零,则文件夹为空,否则文件夹为非空。 WEXITSTATUS宏返回已执行命令的退出代码。

注意:如果文件夹不存在,或者您没有正确的权限来访问它,则此程序必须打印“文件夹为空”。