ファイルがCに存在するかどうかを確認する最良の方法は何ですか?

access() を調べる unistd.h にある関数 .関数を次のように置き換えることができます

if( access( fname, F_OK ) == 0 ) {
    // file exists
} else {
    // file doesn't exist
}

R_OK も使用できます 、 W_OK 、および X_OK F_OK の代わりに 存在ではなく、読み取り許可、書き込み許可、および実行許可を (それぞれ) チェックし、それらのいずれかを一緒に OR できます (つまり、読み取り の両方をチェックします)。 R_OK|W_OK を使用した書き込み権限 )

更新 :Windows では W_OK を使用できないことに注意してください アクセス関数は DACL を考慮しないため、書き込み許可を確実にテストします。 access( fname, W_OK ) ファイルに読み取り専用属性が設定されていないため、0 (成功) が返される場合がありますが、それでもファイルへの書き込み権限がない可能性があります。


stat を使用 このように:

#include <sys/stat.h>   // stat
#include <stdbool.h>    // bool type

bool file_exists (char *filename) {
  struct stat   buffer;   
  return (stat (filename, &buffer) == 0);
}

次のように呼び出します:

#include <stdio.h>      // printf

int main(int ac, char **av) {
    if (ac != 2)
        return 1;

    if (file_exists(av[1]))
        printf("%s exists\n", av[1]);
    else
        printf("%s does not exist\n", av[1]);

    return 0;
}

通常、ファイルが存在するかどうかを確認したいときは、作成したいからです そうでない場合は、そのファイル。あなたがしない場合、Graeme Perrowの答えは良いです そのファイルを作成したいのですが、そうすると競合状態に対して脆弱です。ファイルが存在するかどうかを確認してから、実際にファイルを開いて書き込みを行うまでの間に、別のプロセスがファイルを作成する可能性があります。 (笑わないでください...これは悪い可能性があります 作成されたファイルがシンボリックリンクだった場合のセキュリティへの影響!)

存在を確認したい場合 および ファイルが存在しない場合は、原子的にファイルを作成します 競合状態が発生しないようにするには、次を使用します:

#include <fcntl.h>
#include <errno.h>

fd = open(pathname, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR);
if (fd < 0) {
  /* failure */
  if (errno == EEXIST) {
    /* the file already existed */
    ...
  }
} else {
  /* now you can use the file */
}