Cómo obtener la lista de archivos en el directorio C++
-
Usa
std::filesystem::directory_iterator
para obtener una lista de archivos en un directorio -
Use las funciones
opendir/readdir
para obtener una lista de archivos en un directorio -
Usa
std::filesystem::recursive_directory_iterator
para obtener una lista de archivos en todos los subdirectorios
En este artículo, presentaremos formas de obtener una lista de archivos en un directorio específico.
Usa std::filesystem::directory_iterator
para obtener una lista de archivos en un directorio
Este método es parte de la librería <filesystem>
añadida en C++17. Tengan en cuenta que algunos compiladores antiguos pueden no tener soporte para este método, pero esta es la solución nativa de C++ para este problema. El directory_iterator
se usa en un bucle for
basado en rangos, y toma la ruta al directorio como argumento. En este ejemplo, especificamos una ruta al directorio raíz, pero deberías modificar esta variable en base a tu sistema para pasar un nombre 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;
}
Production (Depende del directorio):
Archive2| lib| .| ..| lib64| Archive| dev| var| bin| usr| etc| tmp| proc|
Use las funciones opendir/readdir
para obtener una lista de archivos en un directorio
Este método es mucho más verboso, pero es una alternativa fiable para la manipulación del sistema de archivos.
Para usar las funciones openendir
y readdir
, debes incluir el archivo de cabecera dirent.h
.
opendir
abre un directorio especificado por nombre y devuelve su puntero, que es de DIR*
.
readdir
opera con el argumento DIR*
y devuelve una estructura especial llamada dirent
(ver información completa).
Una vez que ponemos la llamada readdir
en un bucle while
comparando con nullptr
, actúa como un iterador de directorios, y podemos obtener acceso a los nombres de los ficheros a través de cada estructura devuelta 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;
}
Fíjate en que muchas de las sentencias if
actúan como mecanismos de manejo de excepciones ya que las funciones opendir
y readdir
devuelven punteros NULL
sobre el error/fin del directorio.
Usa std::filesystem::recursive_directory_iterator
para obtener una lista de archivos en todos los subdirectorios
Este método es útil cuando se deben buscar en varios subdirectorios para encontrar nombres de archivos específicos. El método se mantiene igual que el directory_iterator
. Sólo tienes que hacer un bucle a través de él con un bucle basado en el rango y operar en los archivos según sea necesario:
#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