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

Jinku Hu 12 outubro 2023
  1. Utilize std::filesystem::directory_iterator para obter uma lista de arquivos em um diretório
  2. Use opendir/readdir Funções para obter uma lista de arquivos em um Diretório
  3. Utilize std::filesystem::recursive_directory_iterator para obter uma lista de arquivos em todos os subdiretórios
Como obter a Lista de Arquivos em Diretório em C++

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;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ File