Atravessar a árvore de diretórios com eficiência com opendir (), readdir () e closedir ()

As rotinas C opendir (), readdir () e closedir () fornecem uma maneira de percorrer uma estrutura de diretórios. No entanto, cada estrutura dirent retornada por readdir () não parece fornecer uma maneira útil de obter o conjunto de ponteiros para DIR que eu precisaria recursar nos subdiretórios de diretório.

É claro, eles me deram o nome dos arquivos, então eu poderia anexá-lo ao caminho do diretório e stat () e opendir () ou alterar o diretório de trabalho atual do processo via chdir () e roll de volta via chdir ("..").

O problema com a primeira abordagem é que, se o comprimento do caminho do diretório for grande o suficiente, o custo de passar uma string que a contenha para opendir () sobrecarregará o custo de abrir um diretório. Se você é um pouco mais teórico, pode dizer que sua complexidade pode aumentar além do tempo linear (na contagem total de caracteres dos nomes de arquivos (relativos) na árvore de diretórios).

Além disso, a segunda abordagem tem um problema. Como cada processo possui um único diretório de trabalho atual, todos os segmentos, exceto um, precisarão bloquear um aplicativo multithread. Além disso, não sei se o diretório de trabalho atual é apenas uma mera conveniência (ou seja, o caminho relativo será anexado a ele antes de uma consulta do sistema de arquivos). Se for, essa abordagem também será ineficiente.

Estou aceitando alternativas para essas funções. Então, como é possível percorrer uma árvore de diretórios UNIX com eficiência (tempo linear na contagem total de caracteres dos arquivos sob ela)?

questionAnswers(4)

yourAnswerToTheQuestion