Comment vérifier si un fichier existe en C++

Jinku Hu 12 octobre 2023
Comment vérifier si un fichier existe en C++

Cet article présente les méthodes C++ permettant de vérifier si un certain fichier existe dans un répertoire. Notez, cependant, que le tutoriel suivant est basé sur la bibliothèque C++ 17 filesystem, qui n’est supportée que par les nouveaux compilateurs.

Utilisez std::filesystem::exists pour vérifier si un fichier existe dans un répertoire

La méthode exists prend un chemin comme argument et retourne la valeur booléenne true si elle correspond à un fichier ou un répertoire existant. Dans l’exemple suivant, nous initialisons un vecteur avec des noms de fichiers arbitraires pour les vérifier dans le système de fichiers avec les fonctions exists. Sachez que la méthode exists ne vérifie que le répertoire courant où se trouve le fichier exécutable.

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::exists;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};

  for (const auto &file : files_to_check) {
    exists(file) ? cout << "Exists\n" : cout << "Doesn't exist\n";
  }

  return EXIT_SUCCESS;
}

Le code ci-dessus peut être réimplémenté avec l’algorithme STL for_Each, qui fournira une meilleure réutilisation du code:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::exists;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};

  auto check = [](const auto &file) {
    exists(file) ? cout << "Exists\n" : cout << "Doesn't exist\n";
  };

  for_each(files_to_check.begin(), files_to_check.end(), check);

  return EXIT_SUCCESS;
}

La méthode exists peut être plus instructive si elle est combinée avec d’autres routines de la bibliothèque <filesystem> comme : is_directory et is_regular_file. En général, certaines méthodes de systèmes de fichiers ne font pas la distinction entre les fichiers et les répertoires, mais nous pouvons utiliser des fonctions spécifiques de vérification des types de fichiers pour vérifier les noms de chemin, comme le montre l’exemple de code suivant:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::exists;
using std::filesystem::is_directory;
using std::filesystem::is_regular_file;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};

  for (const auto &file : files_to_check) {
    if (exists(file)) {
      if (is_directory(file)) cout << "Directory exists\n";
      if (is_regular_file(file))
        cout << "File exists\n";
      else
        cout << "Exists\n";
    } else {
      cout << "Doesn't exist\n";
    };
  };

  return EXIT_SUCCESS;
}

Considérons maintenant un cas où nous voulons naviguer vers un répertoire particulier et vérifier un nom de fichier spécifique s’il existe. Pour ce faire, nous devons utiliser la méthode current_path, qui retourne le répertoire courant si aucun argument n’est passé, ou qui peut se transformer en répertoire si l’argument path est spécifié. N’oubliez pas de changer le chemin d’accès au répertoire et le nom des fichiers en fonction de votre système pour mieux vérifier la sortie du programme:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::current_path;
using std::filesystem::exists;
using std::filesystem::is_directory;
using std::filesystem::is_regular_file;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};
  current_path("../");
  for (const auto &file : files_to_check) {
    exists(file) ? cout << "Exists\n" : cout << "Doesn't exist\n";
  }

  return EXIT_SUCCESS;
}

On peut aussi vérifier les permissions de l’utilisateur courant sur les fichiers d’un répertoire lors de l’itération par directory_iterator. La méthode status est utilisée pour obtenir les permissions et les stocker dans une classe spéciale appelée perms. Les permissions récupérées peuvent être affichées avec des opérations bit par bit sur la structure perms. L’exemple suivant montre l’extraction des permissions du propriétaire uniquement (voir la liste complète ici).

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::filesystem::directory_iterator;
using std::filesystem::exists;
using std::filesystem::perms;

using std::string;

int main() {
  vector<std::filesystem::perms> f_perm;
  string path = "../";

  for (const auto& file : directory_iterator(path)) {
    cout << file << " - ";
    cout << ((file.status().permissions() & perms::owner_read) != perms::none
                 ? "r"
                 : "-")
         << ((file.status().permissions() & perms::owner_write) != perms::none
                 ? "w"
                 : "-")
         << ((file.status().permissions() & perms::owner_exec) != perms::none
                 ? "x"
                 : "-")
         << endl;
  }
  cout << endl;
  return EXIT_SUCCESS;
}
Auteur: 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

Article connexe - C++ File