98 votes

Quelle est la meilleure façon de vérifier si un fichier existe en C++ (multiplateforme) ?

J'ai lu les réponses pour Quel est le meilleur moyen de vérifier l'existence d'un fichier en C ? (multiplateforme) mais je me demande s'il n'y a pas un meilleur moyen de le faire en utilisant les librairies c++ standard ? De préférence sans essayer d'ouvrir le fichier.

Les deux sites stat y access sont pratiquement impossibles à trouver sur Google. Que devrais-je #include pour les utiliser ?

0 votes

<io.h> pour l'accès (qui pourrait en fait être _access).

0 votes

Oui, comme cela a été souligné ici.

177voto

Andreas Magnusson Points 4442

Utilisez boost::filesystem :

#include <boost/filesystem.hpp>

if ( !boost::filesystem::exists( "myfile.txt" ) )
{
  std::cout << "Can't find my file!" << std::endl;
}

69 votes

Il semble un peu compliqué d'installer une énorme bibliothèque tierce pour faire quelque chose qui devrait être simple

90 votes

Boost est une bibliothèque où est développée une grande partie de ce qui fera un jour partie de la bibliothèque standard du C++. La plupart des personnes impliquées dans Boost sont également impliquées dans la norme C++. Donc Boost n'est pas seulement cualquier la bibliothèque d'un tiers. Si vous programmez en C++, vous devrait faites installer le boost !

0 votes

Je crois me souvenir que b::fs::exists renvoie "true" pour les fichiers inexistants sur les partages réseau : " \\machine\share\this_file_doesnt_exist " => vrai. La dernière fois que j'ai vérifié, c'était sur Boost 1.33, faites attention...

41voto

rlerallut Points 2806

Faites attention aux conditions de concurrence : si le fichier disparaît entre la vérification de son existence et le moment où vous l'ouvrez, votre programme échouera de manière inattendue.

Il est préférable d'ouvrir le fichier, de vérifier qu'il n'y a pas d'erreur et, si tout est bon, de faire quelque chose avec le fichier. C'est encore plus important avec le code critique pour la sécurité.

Détails sur la sécurité et les conditions de course : http://www.ibm.com/developerworks/library/l-sprace.html

30voto

MattyT Points 3195

Je suis un heureux utilisateur de boost et j'utiliserais certainement la solution d'Andreas. Mais si vous n'avez pas accès aux librairies boost, vous pouvez utiliser la librairie stream :

ifstream file(argv[1]);
if (!file)
{
    // Can't open file
}

Ce n'est pas aussi agréable que boost::filesystem::exists puisque le fichier sera réellement ouvert... mais c'est généralement la prochaine chose que vous voulez faire de toute façon.

15 votes

Mais avec ce code, vous vous retrouveriez dans la clause if si vous n'avez pas les autorisations pour le fichier, bien qu'il existe. Dans la plupart des cas, cela n'a pas d'importance, mais cela vaut quand même la peine d'être mentionné.

1 votes

J'ai remarqué que good() donne aussi vrai si l'argument donné désigne un répertoire, voir stackoverflow.com/questions/9591036/

13voto

Utilisez stat(), s'il est suffisamment multiplateforme pour vos besoins. Il ne s'agit cependant pas d'une norme C++, mais POSIX.

Sous MS Windows, il y a _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.

1 votes

<sys/types.h> et <sys/stat.h> Voir msdn.microsoft.com/fr/us/library/14h5k7ff(VS.71).aspx

2 votes

Belle réponse +1 pour PAS D'UTILISATION DE BOOST Cependant, il n'était pas facile d'écrire cela à partir de ce qui est fourni ici, alors j'ai juste posté une réponse. Vérifiez-le s'il vous plaît.

9voto

Rob Points 22239

Et si access ?

#include <io.h>

if (_access(filename, 0) == -1)
{
    // File does not exist
}

0 votes

Est-ce que io.h est normalement disponible sous Windows et Linux même s'il n'est pas standard ?

1 votes

Access() est une fonction POSIX qui est disponible via <unistd.h> sous Linux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X