Obtendo lista de arquivos em uma pasta em C++: guia completo do iniciante ao profissional

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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órios
  • DIR *dir — ponteiro para o fluxo do diretório
  • struct 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.h e FindFirstFile/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

  1. Você chama FindFirstFile com um padrão (por exemplo, "C:\\\\*").
  2. Obtém um handle e a primeira entrada.
  3. Em um loop, chama FindNextFile até que retorne 0.
  4. 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