J'ai lu les réponses pour Quelle est la meilleure façon de vérifier si un fichier existe en C? (multiplate-forme) , mais je me demande s'il existe une meilleure façon de le faire en utilisant des bibliothèques C ++ standard? De préférence sans essayer d'ouvrir le fichier du tout.
Les deux stat
et access
sont à peu près indomptables. Que dois-je #include
utiliser pour les utiliser?
Réponses:
Utilisez boost :: filesystem :
la source
Attention aux conditions de concurrence: si le fichier disparaît entre le contrôle «existe» et l'heure à laquelle vous l'ouvrez, votre programme échouera de manière inattendue.
Il vaut mieux aller ouvrir le fichier, vérifier l'échec et si tout va bien, 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 concurrence : http://www.ibm.com/developerworks/library/l-sprace.html
la source
Je suis un utilisateur de boost heureux et j'utiliserais certainement la solution d'Andreas. Mais si vous n'avez pas accès aux bibliothèques boost, vous pouvez utiliser la bibliothèque de flux:
Ce n'est pas aussi bien que boost :: filesystem :: existe puisque le fichier sera en fait ouvert ... mais c'est généralement la prochaine chose que vous voulez faire de toute façon.
la source
Utilisez stat (), si elle est suffisamment multiplateforme pour vos besoins. Ce n'est pas le standard C ++, mais POSIX.
Sur MS Windows, il y a _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
la source
Et pourquoi pas
access
?la source
Une autre possibilité consiste à utiliser la
good()
fonction dans le flux:la source
Je reconsidérerais essayer de savoir si un fichier existe. Au lieu de cela, vous devriez essayer de l'ouvrir (en Standard C ou C ++) dans le même mode que vous avez l'intention de l'utiliser. À quoi sert de savoir que le fichier existe si, par exemple, il n'est pas accessible en écriture lorsque vous devez l'utiliser?
la source
ls
programme similaire? Je suppose que l'affiche originale ici ne veut pas du tout ouvrir le fichier. La fonction stat de Posix est censée vous donner des informations sur les permissions du fichier, donc elle résoudrait ce problème.Si votre compilateur prend en charge C ++ 17, vous n'avez pas besoin de boost, vous pouvez simplement utiliser
std::filesystem::exists
la source
NON renforcerREQUIS , ce qui serait exagéré .
Utilisez stat () (pas multiplateforme bien que comme mentionné par pavon), comme ceci:
Production:
Une autre version (et celle) peut être trouvée ici .
la source
Si vous utilisez déjà la classe de flux de fichier d'entrée (
ifstream
), vous pouvez utiliser sa fonctionfail()
.Exemple:
la source