Obtenir le répertoire actuel en C++
-
Utiliser la fonction
getcwd
pour obtenir le répertoire courant -
Utilisez la fonction
std::filesystem::current_path
pour obtenir le répertoire courant -
Utilisez la fonction
get_current_dir_name
pour obtenir le répertoire courant
Cet article explique plusieurs méthodes pour obtenir le répertoire actuel en C++.
Utiliser la fonction getcwd
pour obtenir le répertoire courant
Le getcwd
est une fonction compatible POSIX, disponible sur de nombreux systèmes basés sur Unix, et il peut récupérer le répertoire de travail actuel. La fonction prend deux paramètres - le premier tampon char*
où le nom du chemin d’accès au répertoire est stocké et la taille du tampon. Notez que nous déclarons un tableau à longueur fixe de char
et que nous allouons un tampon de 256 éléments, comme un exemple arbitraire. Si l’appel est réussi, le nom stocké du répertoire courant peut être imprimé en accédant au tampon char
.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char tmp[256];
getcwd(tmp, 256);
cout << "Current working directory: " << tmp << endl;
return EXIT_SUCCESS;
}
Production :
Current working directory: /tmp/projects
Utilisez la fonction std::filesystem::current_path
pour obtenir le répertoire courant
La méthode std::filesystem::current_path
fait partie de la bibliothèque C++ du système de fichiers et est la méthode recommandée pour récupérer le répertoire courant selon les directives de codage modernes. Notez que la bibliothèque filesystem
a été ajoutée après la version C++17 et que la version correspondante du compilateur est nécessaire pour travailler avec le code suivant.
std::filesystem::current_path
sans aucun argument retourne le répertoire de travail courant et peut être directement sorti en console. Si le chemin du répertoire est passé à la fonction, il change le répertoire courant en chemin donné.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
cout << "Current working directory: " << current_path() << endl;
return EXIT_SUCCESS;
}
Production :
Current working directory: /tmp/projects
Utilisez la fonction get_current_dir_name
pour obtenir le répertoire courant
Le get_current_dir_name
est la fonction de la bibliothèque C qui est similaire à la méthode précédente sauf qu’elle renvoie char*
où le chemin du répertoire de travail courant est stocké après un appel réussi. Le get_current_dir_name
alloue automatiquement assez de mémoire dynamique pour le chemin à stocker, mais l’appelant est responsable de libérer la mémoire avant la sortie du programme.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char *cwd = get_current_dir_name();
cout << "Current working directory: " << cwd << endl;
free(cwd);
return EXIT_SUCCESS;
}
Production :
Current working directory: /tmp/projects
Une autre fonctionnalité utile de la bibliothèque C++ de système de fichiers est l’objet std::filesystem::directory_iterator
, qui peut être utilisé pour itérer à travers les éléments d’un chemin de répertoire donné. Notez que les éléments peuvent être des fichiers, des liens symboliques, des répertoires ou des sockets, et leur ordre d’itération n’est pas spécifié. Dans l’exemple suivant, nous affichons le nom du chemin de chaque élément dans le répertoire de travail en cours.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
using std::filesystem::directory_iterator;
int main() {
for (auto& p : directory_iterator("./")) cout << p.path() << '\n';
return EXIT_SUCCESS;
}
Production :
"./main.cpp"
"./a.out"
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