Por que você pode precisar de uma lista de arquivos em C++?
Imagine: você está escrevendo um programa que precisa processar centenas de logs, verificar a existência de arquivos de configuração ou simplesmente mostrar ao usuário o que está em uma pasta. Sem a capacidade de "olhar" dentro de um diretório, você encontra um obstáculo. É por isso que a pergunta «How can I get the list of files in a directory using C or C++?» é uma das mais populares no Stack Overflow. E hoje vamos abordá-la do início ao fim.
No artigo, mostrarei três maneiras principais: desde o clássico estilo C (funciona em qualquer lugar, mas requer cuidado) até o moderno C++17 std::filesystem (conciso, seguro e elegante). Você aprenderá como escolher a ferramenta certa para sua tarefa e obterá exemplos de código prontos que podem ser inseridos imediatamente em seu projeto.
Método 1: Clássico — dirent.h (POSIX / Linux / macOS)
Este método é o "avô" de todas as soluções. É usado em C e C++ em sistemas Unix-like. A ideia é simples: você abre um diretório, lê as entradas uma por uma e fecha. Sem frescuras, mas com controle total.
Inclusão e estruturas
Você precisará de:
#include <dirent.h>— trabalho com diretóriosDIR *dir— ponteiro para o fluxo do diretóriostruct dirent *entry— estrutura contendo o nome do arquivo
Exemplo de código: exibição simples de todos os nomes
#include <iostream>#include <dirent.h>
int main() { const char* path = "."; // pasta atual DIR* dir = opendir(path); if (dir == nullptr) { std::cerr << "Não foi possível abrir o diretório: " << path << std::endl; return 1; }
struct dirent* entry; while ((entry = readdir(dir)) != nullptr) { std::cout << entry->d_name << std::endl; }
closedir(dir); return 0;}Observações importantes
- A função
readdir()retorna os nomes.(diretório atual) e..(diretório pai). Normalmente, você precisa ignorá-los:
if (entry->d_name[0] == '.') continue;- Este código **não funciona no Windows** diretamente. Para Windows, existem
windows.heFindFirstFile/FindNextFile(falaremos sobre isso depois). - Prós: minimalismo, funciona sem C++17. Contras: não é multiplataforma, não há filtragem por tipo de arquivo.
Método 2: API do Windows — FindFirstFile e FindNextFile
Se seu alvo é Windows, esqueça o dirent.h. Em vez disso, use a WinAPI nativa. Ela é poderosa, mas o código fica verboso.
Como funciona
- Você chama
FindFirstFilecom um padrão (por exemplo,"C:\\\\*"). - Obtém um handle e a primeira entrada.
- Em um loop, chama
FindNextFileaté que retorne 0. - Fecha o handle com
FindClose.
Exemplo: lista de arquivos na raiz do disco C:
#include <iostream>#include <windows.h>
int main() { WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile("C:\\\\*", &findFileData);
if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "Não foi possível encontrar arquivos (código de erro: " << GetLastError() << ")" << std::endl; return 1; }
do { // Ignorar "." e ".." if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0) { std::cout << findFileData.cFileName << std::endl; } } while (FindNextFile(hFind, &findFileData) != 0);
FindClose(hFind); return 0;}O que é importante saber
- Em
WIN32_FIND_DATA, existe o campodwFileAttributesBlogs
Book Recommendations
Leia também
A magia do const no final de funções C++: o que acontece por baixo dos panos?
Genéricos em Go: como a programação genérica está mudando as regras do jogo
Ordenação de array por valor de coluna em PHP: tudo que você precisa saber
Containerização de aplicações TypeScript com Docker: guia completo
Como calcular a diferença entre datas em C#: número de dias