fopen
実際にファイルを開こうとしますが、読み取りアクセス権がない場合は実行できません。ファイルを開かずにファイルが存在するかどうかを確認するには、stat
;を使用します。stat
ファイルに関するメタデータを提供し、ファイル自体ではなく、ファイルを含むディレクトリへの読み取りアクセスのみを必要とします。
int doesFileExist(const char *filename) {
struct stat st;
int result = stat(filename, &st);
return result == 0;
}
が0 でないかerrno
どうかを確認することで、より洗練されたものになる可能性があります。result
存在する場合、ファイルは存在しません。指定したパスの一部である場合は、errno
ディレクトリではありません。存在する場合は、パス内のディレクトリのいずれかに対する読み取り権限がなかったため、指定できません。答えなど。ENOENT
ENOTDIR
EACCESS
stat
また、シンボリック リンクを使用するプラットフォーム (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;
}