fopen実際にファイルを開こうとしますが、読み取りアクセス権がない場合は実行できません。ファイルを開かずにファイルが存在するかどうかを確認するには、stat;を使用します。statファイルに関するメタデータを提供し、ファイル自体ではなく、ファイルを含むディレクトリへの読み取りアクセスのみを必要とします。
int doesFileExist(const char *filename) {
struct stat st;
int result = stat(filename, &st);
return result == 0;
}
が0 でないかerrnoどうかを確認することで、より洗練されたものになる可能性があります。result存在する場合、ファイルは存在しません。指定したパスの一部である場合は、errnoディレクトリではありません。存在する場合は、パス内のディレクトリのいずれかに対する読み取り権限がなかったため、指定できません。答えなど。ENOENTENOTDIREACCESSstat
また、シンボリック リンクを使用するプラットフォーム (Unix ライク、または Windows Vista 以降) を使用している場合は、シンボリック リンクとそれが指すファイルのどちらについてクエリを実行しているかを認識しておく必要があります。を呼び出す場合はstat、それが指すファイルについて尋ねています。dir/linkを指すシンボリックリンクがある場合は、other/file結果statが返されますother/file(ファイルを開いた場合に得られるものであるため、通常はこれが必要です)。ただし、リンク自体に興味がある場合 (「dir/link存在しない場合でも存在するかどうか」を知りたい場合other/file) は、 を使用する必要がありますlstat()。
stat()互換ラッパーとして Windows で動作します (彼らは を使用することを好み、使用_stat()しない場合は警告します) が、通常はネイティブ プラットフォーム API を使用することをお勧めします。Windows では、おそらく以下を使用する必要がありますGetFileAttributes()。
int doesFileExist(const char *filename) {
return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
}