¿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 directoriosDIR *dir— puntero al flujo del directoriostruct 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.hyFindFirstFile/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
- Llama a
FindFirstFilecon un patrón (por ejemplo,"C:\\\\*"). - Obtiene un manejador y la primera entrada.
- En un bucle, llama a
FindNextFilehasta que devuelva 0. - 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
- En
WIN32_FIND_DATAexiste el campodwFileAttributesBlogs
Book Recommendations
Leer también
Generics en Rust: para qué sirven y cómo usarlos
Inyección de Dependencias (Dependency Injection) en Java: guía completa
StringBuilder vs concatenación en toString(): cómo funciona bajo el capó
Por qué los emojis 👩👩👧👦 "rompen" las líneas en Swift? Análisis con código
CrudRepository vs JpaRepository: Principales errores y cómo evitarlos