Ottieni l'lista dei file nella directory in C++
-
Usa
std::filesystem::directory_iterator
per ottenere una lista di file in una directory -
Usa le funzioni
opendir/readdir
per ottenere una lista di file in una directory -
Usa
std::filesystem::recursive_directory_iterator
per ottenere una lista di file in tutte le sottodirectory
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;
}
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