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