web-dev-qa-db-ja.com

C ++にファイルが存在するかどうかを確認する最良の方法は何ですか? (クロスプラットフォーム)

の回答を読みました。Cにファイルが存在するかどうかを確認する最良の方法は何ですか? (クロスプラットフォーム) が、標準のC++ライブラリを使用してこれを行うためのより良い方法があるかどうか疑問に思っていますか?できれば、ファイルをまったく開かないでください。

stataccessは、どちらもほとんどGoogleに対応していません。何をすればいいですか#includeこれらを使用するには?

95
c0m4

boost :: filesystem :を使用します

#include <boost/filesystem.hpp>

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

競合状態に注意してください。「存在する」チェックとそれを開く時間の間にファイルが消えると、プログラムは予期せず失敗します。

ファイルを開いて失敗したかどうかを確認し、すべてが正常であれば、ファイルで何かをすることをお勧めします。セキュリティが重要なコードではさらに重要です。

セキュリティおよび競合状態に関する詳細: http://www.ibm.com/developerworks/library/l-sprace.html

41
rlerallut

私は幸せなブーストユーザーであり、確かにAndreasのソリューションを使用します。ただし、ブーストライブラリにアクセスできない場合は、ストリームライブラリを使用できます。

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

ファイルが実際に開かれるので、boost :: filesystem :: existsほどではありませんが、通常は次のことを行います。

30
MattyT

ニーズに十分対応できるクロスプラットフォームの場合は、stat()を使用します。ただし、C++標準ではなく、POSIXです。

MS Windowsには、_stat、_stat64、_stati64、_wstat、_wstat64、_wstati64があります。

11
activout.se

別の可能性は、ストリームでgood()関数を使用することです。

#include <fstream>     
bool checkExistence(const char* filename)
{
     ifstream Infield(filename);
     return Infield.good();
}
9
Samer

accessはどうですか?

#include <io.h>

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

ファイルが存在するかどうかを調べることを再検討します。代わりに、使用するのと同じモードで(標準CまたはC++で)開いてみてください。たとえば、使用する必要があるときにファイルが書き込み可能でない場合、ファイルが存在することを知っているのはどのような用途ですか?

7
fizzer

コンパイラがC++ 17をサポートしている場合、ブーストは必要ありません。単に std::filesystem::exists

#include <iostream> // only for std::cout
#include <filesystem>

if (!std::filesystem::exists("myfile.txt"))
{
    std::cout << "File not found!" << std::endl;
}
3
AlbertM

NO boost REQUIRED、これはoverkillになります。


次のように stat() (pavonが言及しているようにクロスプラットフォームではありません)を使用します。

#include <sys/stat.h>
#include <iostream>

// true if file exists
bool fileExists(const std::string& file) {
    struct stat buf;
    return (stat(file.c_str(), &buf) == 0);
}

int main() {
    if(!fileExists("test.txt")) {
        std::cerr << "test.txt doesn't exist, exiting...\n";
        return -1;
    }
    return 0;
}

出力:

C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt
ls: test.txt: No such file or directory
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
test.txt doesn't exist, exiting...

別のバージョン(およびそれ)を見つけることができます here

3
gsamaras

入力ファイルストリームクラス(ifstream)を既に使用している場合、その関数fail()を使用できます。

例:

ifstream myFile;

myFile.open("file.txt");

// Check for errors
if (myFile.fail()) {
    cerr << "Error: File could not be found";
    exit(1);
}
0
Reza Saadati