Эффективно пройти через дерево каталогов с помощью opendir (), readdir () и closedir ()

Подпрограммы C opendir (), readdir () и closedir () позволяют мне пройти через структуру каталогов. Тем не менее, каждая структура dirent, возвращаемая readdir (), по-видимому, не дает мне полезного способа получить набор указателей на DIR, которые мне нужно было бы использовать в подкаталогах каталога.

Конечно, они дают мне имена файлов, поэтому я могу либо добавить это имя к пути к каталогу и stat () и opendir () к ним, либо изменить текущий рабочий каталог процесса с помощью chdir () и roll это обратно через chdir ("..").

Проблема с первым подходом состоит в том, что если длина пути к каталогу достаточно велика, то стоимость передачи строки, содержащей ее, в opendir () будет перевешивать стоимость открытия каталога. Если вы немного более теоретичны, вы можете сказать, что ваша сложность может возрасти за пределы линейного времени (в общем количестве символов (относительных) имен файлов в дереве каталогов).

Также у второго подхода есть проблема. Поскольку каждый процесс имеет один текущий рабочий каталог, все потоки, кроме одного, должны будут блокироваться в многопоточном приложении. Кроме того, я не знаю, является ли текущий рабочий каталог простым удобством (то есть относительный путь будет добавлен к нему до запроса файловой системы). Если это так, то этот подход тоже будет неэффективным.

Я принимаю альтернативы этим функциям. Так как же можно эффективно обходить дерево каталогов UNIX (линейное время в общем количестве символов в файлах под ним)?

Ответы на вопрос(4)

Ваш ответ на вопрос