web-dev-qa-db-ja.com

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

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

Linuxを使用しています

62
Jerry

私はおそらく行くでしょう:

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

good メソッドは、ストリームを読み込む準備ができているかどうかをチェックします。

82
Kim Gräsman

Boost.Filesystem を使用できます。 boost::filesystem::exist 関数。

読み取りアクセス権を確認する方法がわかりません。 Boost.Filesystem も見ることができます。ただし、実際にファイルを読み取ろうとする以外の(ポータブル)方法はないでしょう。

22
Adam Badura

どのオペレーティングシステム/プラットフォームですか?

Linux/Unix/MacOSXでは、 fstat を使用できます。

Windowsでは、 GetFileAttributes を使用できます。

通常、標準のC/C++ IO関数でこれを実行する移植可能な方法はありません。

11

uNIXを使用している場合は、 access() で読み取り可能かどうかがわかります。ただし、ACLが使用されている場合はより複雑になります。この場合、ifstreamでファイルを開いて読み取りを試みるのが最善です。読み取りできない場合、ACLは読み取りを禁止することがあります。

10
neoneye

C++ 11以降では、good()の代わりに暗黙的な operator bool を使用できます。

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

最終的にポスターはLinuxを使用していると言っていましたが、Windowsの PathFileExists() API呼び出しに言及している人がいないことに驚いています。

Shlwapi.libライブラリとShlwapi.hヘッダーファイルを含める必要があります。

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

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

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

C++ 17、クロスプラットフォーム: std::filesystem::exists および std::filesystem::statusstd::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.";
        }
    }
}

ファイルタイプ も確認することを検討してください。

2
Roi Danton

Windowsでのfstatの使用に関して、それがあなたが望むものかどうかはわかりません。 Microsoft からファイルは既に開いている必要があります。 Stat が機能します。

0
Antoni