HOWTO · C++

Como obter a Lista de Arquivos em Diretório em C++

Este artigo introduz múltiplas maneiras de recuperar a lista de arquivos em um diretório em C++

Nesta página

Neste artigo, apresentaremos formas de obter uma lista de arquivos em um diretório especificado em C++.

Utilize std::filesystem::directory_iterator para obter uma lista de arquivos em um diretório

Este método é parte da biblioteca <filesystem> adicionada em C++17. Note que alguns compiladores antigos podem não ter suporte para este método, mas esta é a solução nativa em C++ para obter a lista de arquivos no diretório. O directory_iterator é utilizado em um loop for baseado em intervalos, e toma o caminho para o diretório como um argumento. Neste exemplo, nós especificamos um caminho para o diretório raiz, mas você deve modificar esta variável com base em seu sistema para passar um caminho válido.

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::directory_iterator;

int main() {
  string path = "/";

  for (const auto& file : directory_iterator(path)) cout << file.path() << endl;

  return EXIT_SUCCESS;
}

Saída (Depende do diretório):

Archive2| lib| .| ..| lib64| Archive| dev| var| bin| usr| etc| tmp| proc|

Use opendir/readdir Funções para obter uma lista de arquivos em um Diretório

Este método é muito mais verboso, mas é uma alternativa confiável para a manipulação do sistema de arquivos.

Para utilizar as funções opendir/readdir, você deve incluir o arquivo de cabeçalho dirent.h.

O opendir abre um diretório especificado pelo nome e retorna seu ponteiro, que é de DIR*.

O readdir opera com o argumento DIR* e retorna uma estrutura especial chamada dirent (veja a informação completa).

Uma vez que colocamos a chamada readdir em um laço de while em comparação com nullptr, ela atua como um iterador de diretório, e podemos ter acesso a nomes de arquivos através de cada um deles devolvido a estrutura de dirent.

#include <dirent.h>

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  DIR *dir;
  struct dirent *diread;
  vector<char *> files;

  if ((dir = opendir("/")) != nullptr) {
    while ((diread = readdir(dir)) != nullptr) {
      files.push_back(diread->d_name);
    }
    closedir(dir);
  } else {
    perror("opendir");
    return EXIT_FAILURE;
  }

  for (auto file : files) cout << file << "| ";
  cout << endl;

  return EXIT_SUCCESS;
}

Observe que muitas das declarações if atuam como mecanismos de tratamento de exceções, uma vez que as funções opendir e readdir retornam indicações NULL sobre erro/fim do diretório.

Utilize std::filesystem::recursive_directory_iterator para obter uma lista de arquivos em todos os subdiretórios

Este método é útil quando vários subdiretórios devem ser pesquisados para nomes de arquivos específicos. O método permanece o mesmo que o directory_iterator. Você só tem que fazer loop através dele com loop baseado no intervalo e operar em arquivos conforme necessário:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::recursive_directory_iterator;

int main() {
  string path = "./";

  for (const auto& file : recursive_directory_iterator(path))
    cout << file.path() << endl;

  return EXIT_SUCCESS;
}