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 и довольно широко стандартно, я думаю.