Проверьте, пуст ли каталог с помощью C в Linux

это правильный способ проверить, является ли каталог пустым или нет в 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 остановится после записи.' и.' .- а значит, пустое "если"!--3-->.

если его пусто или не существует, он должен вернуть 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

Почему это занимает больше времени, чтобы проверьте каталог с большим количеством файлов по сравнению с одним только с одним файлом?

3 ответов


есть ли более эффективный способ для проверки для пустого каталога, особенно если он имеет 1000s файлов, если не пустой

то, как вы написали свой код, не имеет значения, сколько у него файлов (вы break Если n > 2). Так что ваш код использует максимум 5 звонков. Я не думаю, что есть какой-либо способ (переносно) сделать это быстрее.


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;
}

возможно, этот код может вам помочь:

#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 folder 2>/dev | null / wc-l, чтобы подсчитать файлы в папке, если она возвращает ноль, папка пуста, иначе папка не пуста. Макрос WEXITSTATUS возвращает код выхода выполненной команды.

Примечание: если папка не существует или у вас нет нужных разрешений для доступа к нему, эта программа должна напечатать "папка пуста".