Como obter a Lista de Arquivos em Diretório em C++
-
Utilize
std::filesystem::directory_iterator
para obter uma lista de arquivos em um diretório -
Use
opendir/readdir
Funções para obter uma lista de arquivos em um Diretório -
Utilize
std::filesystem::recursive_directory_iterator
para obter uma lista de arquivos em todos os subdiretórios
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;
}
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