7

プログラムを続行する前に、ディレクトリにファイルが存在するかどうかを確認するにはどうすればよいですか? さまざまな方法でファイルを開こうとする回答を読みましたが、ほとんどの場合、チェックしているファイルが破損していて開けないという問題があります。これは、プログラムのエラー チェック部分で発生し、前のコードでエラーが発生した場合にのみトリガーされます。ファイルが存在するかどうかを確認し、存在する場合は削除を依頼し、そうでない場合はメッセージを出力します。

これについてどうすればよいですか?

(エラーを削除して受け入れるだけでも問題ありませんが、これは学習のために行っているため、適切に実行したいのですが...)

編集:

ファイルシステム ライブラリを使用するために Boost をダウンロードしてコンパイルしましたが、エラーは発生していないように見えますが、プログラムをコンパイルしようとすると、次の応答が返されます。

g++ program.cpp -I <path to>/boost_1_54_0 -o output

Undefined symbols for architecture x86_64:
"boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)", referenced from:
  boost::filesystem::exists(boost::filesystem::path const&)in cc1XX8rD.o
"boost::system::system_category()", referenced from:
  __static_initialization_and_destruction_0(int, int)in cc1XX8rD.o
"boost::system::generic_category()", referenced from:
  __static_initialization_and_destruction_0(int, int)in cc1XX8rD.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

プログラムでブーストを使用する唯一の場所は次のとおりです。

boost::filesystem::path my_file(s4);
if (boost::filesystem::exists(my_file)){ ...
4

4 に答える 4

6

stat()またはを使用access():

#include <unistd.h>

int res = access(path, R_OK);
if (res < 0) {
    if (errno == ENOENT) {
         // file does not exist
    } else if (errno == EACCES) {
         // file exists but is not readable
    } else {
         // FAIL
    }
}
于 2013-08-07T10:02:32.963 に答える
3

存在するが破損したデータを含むファイルは、悪影響を与えることなく開くことができます。ファイルの内容を読み取ろうとしない限り。

ただし、「存在するかどうかの確認」はTOCTUIの対象であり、そもそも不要です。ファイルを削除しようとして、削除が常に機能するとは限らないことを受け入れることは、より良いアプローチです。

于 2013-08-07T10:09:39.647 に答える