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