Ottieni l'lista dei file nella directory in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::filesystem::directory_iterator per ottenere una lista di file in una directory
  2. Usa le funzioni opendir/readdir per ottenere una lista di file in una directory
  3. Usa std::filesystem::recursive_directory_iterator per ottenere una lista di file in tutte le sottodirectory
Ottieni l'lista dei file nella directory in C++

In questo articolo, introdurremo modi per ottenere una lista di file in una directory specificata in C++.

Usa std::filesystem::directory_iterator per ottenere una lista di file in una directory

Questo metodo fa parte della libreria <filesystem> aggiunta in C++ 17. Si noti che alcuni compilatori meno recenti potrebbero non avere il supporto per questo metodo, ma questa è la soluzione C++ nativa per ottenere l’lista dei file nella directory. directory_iterator è usato in un cicli for basato su intervalli e prende il percorso della directory come argomento. In questo esempio, specifichiamo un percorso per la directory root, ma dovresti modificare questa variabile in base al tuo sistema per passare un percorso valido.

#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;
}

Output (dipende dalla directory):

Archive2| lib| .| ..| lib64| Archive| dev| var| bin| usr| etc| tmp| proc|

Usa le funzioni opendir/readdir per ottenere una lista di file in una directory

Questo metodo è molto più dettagliato, ma è un’alternativa affidabile per la manipolazione del file system.

Per usare le funzioni opendir / readdir, dovresti includere il file di intestazione dirent.h.

opendir apre una directory specificata dal nome e restituisce il suo puntatore, che è di DIR*.

readdir opera sull’argomento DIR*e restituisce una struttura speciale chiamata dirent (vedi informazioni complete).

Una volta che abbiamo messo la chiamata readdir in un cicli while che paragona a nullptr, agisce come un iteratore di directory, e possiamo avere accesso ai nomi dei file attraverso ciascuna struttura dirent restituita.

#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;
}

Si noti che gran parte delle istruzioni if agiscono come meccanismi di gestione delle eccezioni poiché le funzioni opendir e readdir restituiscono puntatori NULL all’errore / fine della directory.

Usa std::filesystem::recursive_directory_iterator per ottenere una lista di file in tutte le sottodirectory

Questo metodo è utile quando è necessario cercare in più sottodirectory per nomi di file specifici. Il metodo rimane lo stesso di directory_iterator. Devi solo eseguire il bucle con il bucle basato su intervallo e operare sui file secondo necessità:

#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;
}
Autore: 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

Articolo correlato - C++ File