C проверить, существует ли файл

В проекте, который я должен выполнить в стандарте C89, я должен проверить, существует ли файл. Как это сделать?

Я думал об использовании

FILE *file;
if ((file = fopen(fname, "r")) == NULL)
{
  printf("file doesn't exists");
}
return 0;

но я думаю, что может быть больше случаев, тогда файл не существует, что сделает fopen == NULL.

Как мне это сделать? Вместо этого я предпочитаю не использовать.

Ответы

Ответ 1

Если вы не можете использовать stat() в своей среде (что, безусловно, лучший подход), просто оцените errno. Не забудьте включить errno.h.

FILE *file;
if ((file = fopen(fname, "r")) == NULL) {
  if (errno == ENOENT) {
    printf("File doesn't exist");
  } else {
    // Check for other errors too, like EACCES and EISDIR
    printf("Some other error occured");
  }
} else {
  fclose(file);
}
return 0;

Изменить: забыли обернуть fclose в else

Ответ 2

Невозможно проверить существование на определенном уровне в чистом стандарте ISO C. Там нет действительно хорошего портативного способа определить, является ли именованный файл существует; вам, вероятно, придется прибегать к системным методам.

Ответ 3

Это не переносная вещь, поэтому я дам вам вызовы, специфичные для ОС.

В Windows вы используете GetFileAttributes и проверяете возврат -1 (INVALID_HANDLE или что-то в этом роде).

В Linux у вас есть fstat.

В большинстве случаев, я просто делаю трюк открытия файла для тестирования или просто продолжаю использовать файл и проверяю исключения (С++/С#).

Ответ 4

Я предполагаю, что это больше связано с системной средой (например, POSIX или BSD), чем с той версией языка C, которую вы используете.

В POSIX есть stat() syscall, который даст вам информацию о файле, даже если вы не можете его прочитать. Однако, если файл находится в пути, в котором у вас нет прав доступа, он всегда будет терпеть неудачу, независимо от того, существует ли файл.

Если у вас нет доступа к пути, то никогда не должно быть возможности смотреть на содержащиеся файлы.

Ответ 5

Вы действительно хотите получить доступ к файлу? Проверка обычно лучше с access (filename, F_OK) == 0 от unistd.h и довольно широко стандартно, я думаю.