Obteniendo la lista de archivos en una carpeta en C++: guía completa de principiante a profesional

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué podría necesitar una lista de archivos en C++?



Imagine: está escribiendo un programa que debe procesar cientos de registros, verificar la existencia de archivos de configuración o simplemente mostrar al usuario lo que hay en una carpeta. Sin la capacidad de "mirar" dentro de un directorio, se topa con una pared. Por eso la pregunta «How can I get the list of files in a directory using C or C++?» es una de las más populares en Stack Overflow. Y hoy la analizaremos de principio a fin.



En el artículo mostraré tres formas principales: desde el clásico estilo C (funciona en todas partes, pero requiere cuidado) hasta el moderno C++17 std::filesystem (conciso, seguro y elegante). Aprenderá a elegir la herramienta adecuada para su tarea y obtendrá ejemplos de código listos para usar que puede insertar directamente en su proyecto.



Método 1: El clásico — dirent.h (POSIX / Linux / macOS)



Este método es el "abuelo" de todas las soluciones. Se utiliza en C y C++ en sistemas tipo Unix. La idea es simple: abre un directorio, lee las entradas una por una, lo cierra. Sin lujos, pero con control total.



Inclusión y estructuras

Necesitará:

  • #include <dirent.h> — trabajo con directorios
  • DIR *dir — puntero al flujo del directorio
  • struct dirent *entry — estructura que contiene el nombre del archivo


Ejemplo de código: salida simple de todos los nombres

#include <iostream>#include <dirent.h>

int main() { const char* path = "."; // carpeta actual DIR* dir = opendir(path); if (dir == nullptr) { std::cerr << "No se pudo abrir el directorio: " << path << std::endl; return 1; }

struct dirent* entry; while ((entry = readdir(dir)) != nullptr) { std::cout << entry->d_name << std::endl; }

closedir(dir); return 0;}


Detalles importantes

  • La función readdir() devuelve los nombres . (directorio actual) y .. (directorio padre). Normalmente hay que omitirlos:
if (entry->d_name[0] == '.') continue;
  • Este código **no funciona en Windows** de forma nativa. Para Windows existe windows.h y FindFirstFile/FindNextFile (más sobre esto después).
  • Ventajas: minimalismo, funciona sin C++17. Desventajas: no es multiplataforma, no hay filtrado por tipo de archivo.


Método 2: API de Windows — FindFirstFile y FindNextFile



Si su objetivo es Windows, olvídese de dirent.h. En su lugar, use la API nativa de Windows. Es potente, pero el código resulta verboso.



Cómo funciona

  1. Llama a FindFirstFile con un patrón (por ejemplo, "C:\\\\*").
  2. Obtiene un manejador y la primera entrada.
  3. En un bucle, llama a FindNextFile hasta que devuelva 0.
  4. Cierra el manejador con FindClose.


Ejemplo: lista de archivos en la raíz del 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 << "No se pudieron encontrar archivos (código de error: " << GetLastError() << ")" << std::endl; return 1; }

do { // Omitimos "." y ".." if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0) { std::cout << findFileData.cFileName << std::endl; } } while (FindNextFile(hFind, &findFileData) != 0);

FindClose(hFind); return 0;}


Qué es importante saber