Cにファイルが存在するかどうかを確認する最良の方法は何ですか?の回答を読みました。(クロスプラットフォーム)、しかし標準のC ++ライブラリを使用してこれを行うより良い方法があるかどうか疑問に思っていますか?できれば、ファイルをまったく開こうとしないでください。
両方ともstat
、access
ほとんどググできないです。#include
これらを使用するにはどうすればよいですか?
Cにファイルが存在するかどうかを確認する最良の方法は何ですか?の回答を読みました。(クロスプラットフォーム)、しかし標準のC ++ライブラリを使用してこれを行うより良い方法があるかどうか疑問に思っていますか?できれば、ファイルをまったく開こうとしないでください。
両方ともstat
、access
ほとんどググできないです。#include
これらを使用するにはどうすればよいですか?
回答:
#include <boost/filesystem.hpp>
if ( !boost::filesystem::exists( "myfile.txt" ) )
{
std::cout << "Can't find my file!" << std::endl;
}
競合状態に注意してください。「存在する」チェックからファイルを開くまでの間にファイルが消失すると、プログラムが予期せず失敗します。
ファイルに移動してファイルを開き、エラーがないか確認し、問題がなければファイルで何かを行うことをお勧めします。セキュリティが重要なコードではさらに重要です。
セキュリティと競合状態の詳細:http : //www.ibm.com/developerworks/library/l-sprace.html
私はハッピーブーストユーザーであり、間違いなくAndreasのソリューションを使用します。しかし、ブーストライブラリにアクセスできなかった場合は、ストリームライブラリを使用できます。
ifstream file(argv[1]);
if (!file)
{
// Can't open file
}
実際にはファイルが開かれるため、boost :: filesystem :: existsほど良くありませんが、それでも、通常は次のことを行います。
必要に応じてクロスプラットフォームである場合は、stat()を使用します。C ++標準ではありませんが、POSIXです。
MS Windowsには、_stat、_stat64、_stati64、_wstat、_wstat64、_wstati64があります。
いかがaccess
ですか?
#include <io.h>
if (_access(filename, 0) == -1)
{
// File does not exist
}
コンパイラが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;
}
番号 ブースト必須、これはやり過ぎです。
次のように、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...
別のバージョン(およびそれ)は、ここにあります。