C проверить, существует ли файл - PullRequest
14 голосов
/ 21 апреля 2011

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

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 21 апреля 2011

Если вы не можете использовать 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 в другое

3 голосов
/ 21 апреля 2011

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

2 голосов
/ 21 апреля 2011

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

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

В Linux у вас есть fstat, чтобы сделать это.

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

1 голос
/ 29 января 2015

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

1 голос
/ 21 апреля 2011

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

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

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

...