J'ai un fstream my_file ("test.txt"), mais je ne sais pas si test.txt existe. Si cela existe, j'aimerais savoir si je peux le lire aussi. Comment faire ça?
J'utilise Linux.
J'irais probablement avec:
ifstream my_file("test.txt");
if (my_file.good())
{
// read away
}
La méthode good
vérifie si le flux est prêt à être lu.
Vous pouvez utiliser Boost.Filesystem . Il a une fonction boost::filesystem::exist
.
Je ne sais pas comment vérifier les droits d'accès en lecture. Vous pouvez regarder dans Boost.Filesystem aussi. Cependant, il est probable qu'il n'y aura pas d'autre moyen (portable) que d'essayer de lire le fichier.
Quel système d'exploitation/plate-forme?
Sous Linux/Unix/MacOSX, vous pouvez utiliser fstat .
Sous Windows, vous pouvez utiliser GetFileAttributes .
En général, il n’ya pas de moyen portable de faire cela avec les fonctions standard C/C++ IO.
si vous êtes sous unix, alors access () pourra vous dire s'il est lisible. Cependant, si les ACL sont en cours d'utilisation, cela devient alors plus compliqué. Dans ce cas, il est préférable d'ouvrir le fichier avec ifstream et d'essayer de lire. Si vous ne pouvez pas lire, l'ACL peut interdire la lecture.
Depuis C++ 11, il est possible d'utiliser l'opérateur implicite bool au lieu de good()
:
ifstream my_file("test.txt");
if (my_file) {
// read away
}
Je sais que l'affiche a fini par indiquer qu'ils utilisaient Linux, mais je suis un peu surpris que personne n'ait mentionné l'appel API PathFileExists()
pour Windows.
Vous devrez inclure la bibliothèque Shlwapi.lib
et le fichier d’en-tête Shlwapi.h
.
#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>
la fonction retourne une valeur BOOL
et peut être appelée comme suit:
if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
// do something
}
C++ 17, multiplate-forme: Vérifiez l’existence du fichier avec std::filesystem::exists
et la lisibilité avec std::filesystem::status
& std::filesystem::perms
:
#include <iostream>
#include <filesystem> // C++17
namespace fs = std::filesystem;
/*! \return True if owner, group and others have read permission,
i.e. at least 0444.
*/
bool IsReadable(const fs::path& p)
{
std::error_code ec; // For noexcept overload usage.
auto perms = fs::status(p, ec).permissions();
if ((perms & fs::perms::owner_read) != fs::perms::none &&
(perms & fs::perms::group_read) != fs::perms::none &&
(perms & fs::perms::others_read) != fs::perms::none
)
{
return true;
}
return false;
}
int main()
{
fs::path filePath("path/to/test.txt");
std::error_code ec; // For noexcept overload usage.
if (fs::exists(filePath, ec) && !ec)
{
if (IsReadable(filePath))
{
std::cout << filePath << " exists and is readable.";
}
}
}