ファイルが存在し、C++ で読み取り可能かどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1383617

質問

fstream my_file("test.txt") はありますが、test.txt が存在するかどうかはわかりません。存在する場合、私も読むことができるかどうか知りたいです。どうやってするか?

Linux を使用しています。

役に立ちましたか?

解決

私はおそらくとなるだろう

ifstream my_file("test.txt");
if (my_file.good())
{
  // read away
}

good の方法チェックストリームが読み込み可能である場合

他のヒント

あなたは Boost.Filesystem に使用する場合があります。それはboost::filesystem::exist機能を持っています。

私は、読み取りアクセス権をチェックについては方法がわかりません。あなたも Boost.Filesystem の中で見ることができます。しかし、おそらく実際にファイルを読み取ろうよりも、他の(ポータブル)方法はありません。

どのようなオペレーティングシステム/プラットフォーム?

のLinux / Unixの/ MacOSXので、使用することができますにfstatするます。

Windowsでは、 GetFileAttributes に使用することができますます。

通常、標準のC / C ++ IO機能でこれを行うのないポータブルな方法がありません。

あなたがUNIX上にある場合は、次にそれが読めるかどうアクセス()のはあなたを伝えることができます。 ACLのは、使用している場合しかし、それはより多くのあなたがACLが読んで禁止することができるそれから読み取ることができない場合は、この場合には、それは...だけではifstreamでファイルを開き、読んでみてくださいするのが最善ですが、複雑になる。

C ++以来11それは暗黙の演算子を使用することが可能ですBOOLする代わりにgood()のます:

ifstream my_file("test.txt");
if (my_file) {
  // read away
}

投稿者が最終的に Linux を使用していると言ったのは知っていますが、誰も Linux について言及しなかったことにはちょっと驚きました。 PathFileExists() Windows 用の API 呼び出し。

を含める必要があります。 Shlwapi.lib 図書館、そして Shlwapi.h ヘッダファイル。

#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

関数はを返します BOOL 値を指定し、次のように呼び出すことができます。

if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
    // do something
}

C++17、クロスプラットフォーム:ファイルの存在を確認する std::filesystem::exists と読みやすさ 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.";
        }
    }
}

のチェックも検討してください。 ファイルの種類.

それはあなたが望むものであるならば、ウィンドウ内にfstatの使用に関しては、私はわかりません。 からマイクロソフトは、ファイルが既にある必要がありますを開いた。 スタットのあなたのために働く必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top