Подпрограммы C opendir (), readdir () и closedir () позволяют мне пройти через структуру каталогов. Тем не менее, каждая структура dirent, возвращаемая readdir (), по-видимому, не дает мне полезного способа получить набор указателей на DIR, которые мне нужно было бы использовать в подкаталогах каталога.
Конечно, они дают мне имена файлов, так что я могу либо добавить это имя к пути к каталогу и stat () и opendir () к ним, либо изменить текущий рабочий каталог процесса с помощью chdir ( ) и откатите его через chdir ("..").
Проблема с первым подходом заключается в том, что если длина пути к каталогу достаточно велика, то стоимость передачи строки, содержащей ее, в opendir () будет чрезмерной, чем стоимость открытия каталога. Если вы немного более теоретичны, вы можете сказать, что ваша сложность может возрасти за пределы линейного времени (в общем количестве символов (относительных) имен файлов в дереве каталогов).
Кроме того, у второго подхода есть проблема. Поскольку каждый процесс имеет один текущий рабочий каталог, все потоки, кроме одного, должны будут блокироваться в многопоточном приложении. Кроме того, я не знаю, является ли текущий рабочий каталог простым удобством (то есть относительный путь будет добавлен к нему до запроса файловой системы). Если это так, то такой подход тоже будет неэффективным.
Я принимаю альтернативы этим функциям. Так как же эффективно обходить дерево каталогов UNIX (линейное время в общем количестве символов в файлах под ним)?