10

重複の可能性:
ファイルが C に存在するかどうかを確認する最良の方法は何ですか? (クロスプラットフォーム)

ファイルが存在するかどうかを確認したい。テストファイルのパーミッションを「chmod -r somefile」に変更しました。ただし、ファイルが存在するにもかかわらず、ファイルが存在しないと表示されます。

したがって、読み取り権限がない場合、「fopen r」でファイルを開くことができないと思います。しかし、それは、ファイルが存在するか、読み書きできないかを簡単に判断する方法がないことを意味しますか?

それとも私は何かを逃していますか?どんな助けでも素晴らしいでしょう。

ありがとう!

int doesFileExist(const char* filename)
{
  FILE* fptr = fopen(filename, "r");
  if (fptr != NULL)
  {
    fclose(fptr);
    printf("File exists\n");
    return 1;
  }
  printf("File doesnt exist\n");
  return 0;
}

更新: これらの素晴らしいリンクと説明をありがとう!

4

3 に答える 3

20

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;
}
于 2012-12-19T04:16:52.670 に答える
1

ファイルがここに存在するかどうかを実際に確認しているわけではありません...読み取りアクセスでファイルを開くことができるかどうかを確認しています。ファイルが存在しない以外の理由で失敗する可能性があります。ご覧のとおり、読み取り権限がない可能性があります。ファイルがロックされている可能性もあります。

この答えを確認してください:

ファイルがCに存在するかどうかを確認する最良の方法は何ですか? (クロスプラットフォーム)

を使用することstatをお勧めします。これは、ファイルが存在するディレクトリへの読み取りアクセス権がない場合を除いて、ほとんどの場合に機能するはずです。

于 2012-12-19T04:16:11.697 に答える
-1

Linux (および他の多くのシステム) では、opendir()and friends を使用してディレクトリを一覧表示できます。読み取り専用ファイルが表示されると思います。他のプラットフォームでも同様の機能が利用できるはずです。

于 2012-12-19T04:15:32.987 に答える