Obtenir le répertoire actuel en C++

  1. Utiliser la fonction getcwd pour obtenir le répertoire courant
  2. Utilisez la fonction std::filesystem::current_path pour obtenir le répertoire courant
  3. 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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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 <iostream>
#include <string>
#include <filesystem>
#include <unistd.h>

using std::cout; using std::cin;
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"