Проверьте, пуст ли каталог с помощью 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
остановится после записей '.' и '..' и, следовательно, пусто, если n<=2
.
Если он пуст или не существует, он должен возвращать 1, else возвращает 0
Update:
@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
Почему требуется больше времени для проверки каталога с большим количеством файлов по сравнению с одним только с одним файлом?
Ответы
Ответ 1
Есть ли более эффективный способ проверки для пустого каталога, особенно если он имеет 1000 файлов, если не пуст
Как вы написали код, неважно, сколько у него файлов (вы break
, если n > 2). Таким образом, ваш код использует максимум 5 вызовов. Я не думаю, что есть способ (переносимо) сделать это быстрее.
Ответ 2
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;
}
Ответ 3
Возможно, этот код может вам помочь:
#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 > /dev/null | wc -l, чтобы подсчитать файлы в папке, если он возвращает ноль, папка пуста, иначе папка не пуста. Макрос WEXITSTATUS возвращает код завершения выполненной команды.
Примечание. Если папка не существует или у вас нет правильных разрешений для ее доступа, эта программа должна печатать "папка пуста".