Рекурсивный обход каталога в C выглядит примерно так:
Используйте opendir
и readdir
для отображения записей каталога. Я, вероятно, не должен был делать это, но я публикую полный пример кода (без обработки ошибок), потому что есть несколько небольших вещей, которые вы должны сделать, чтобы убедиться, что вы используете API правильно:
DIR *dir;
struct dirent *de;
const char *name;
dir = opendir(dirpath);
if (dir == NULL) {
/* handle error */
}
for (;;) {
errno = 0;
de = readdir(dir);
if (de == NULL) {
if (errno != 0) {
/* handle error */
} else {
/* no more entries left */
break;
}
}
/* name of file (prefix it with dirpath to get a usable file path) */
name = de->d_name;
/* ignore . and .. */
if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')))
continue;
/* do something with the file */
}
if (closedir(dir) != 0) {
/* handle error */
}
При работе с каждым файлом обязательно добавляйте к нему дирпат (вместе с косой чертой, если необходимо). Вы также можете использовать chdir
для спуска и подъема, но на практике это усложняет ситуацию (например, вы не можете перемещаться по двум каталогам одновременно), поэтому я лично рекомендую держать ваш текущий рабочий каталог в неподвижном состоянии и использовать манипуляции со строками для объединения путей. *
Чтобы выяснить, является ли путь каталогом или нет (и, следовательно, следует ли вам opendir()
его), я рекомендую использовать lstat()
вместо stat()
, так как последний следует по символическим ссылкам, что означает, что ваш обход каталога может Вы попадете в цикл, и у вас получится что-то , например, этот вывод ctags .
Конечно, поскольку структура каталогов рекурсивна по своей природе, рекурсия играет естественную роль в процессе обхода: выполните рекурсивный вызов, когда дочерний путь является каталогом.