Cómo obtener la lista de archivos en el directorio C++

Jinku Hu 12 octubre 2023
  1. Usa std::filesystem::directory_iterator para obtener una lista de archivos en un directorio
  2. Use las funciones opendir/readdir para obtener una lista de archivos en un directorio
  3. Usa std::filesystem::recursive_directory_iterator para obtener una lista de archivos en todos los subdirectorios
Cómo obtener la lista de archivos en el directorio C++

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;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ File