Использование PellesC в Windows 8.1.
Я знаю, что эта тема обсуждалась много раз с множеством решений. Я читал решения, в которых говорится об использовании CreateFile
, PathFileExists
, GetFileAttributes
, _access
, которые я немного понимаю.
Я также прочитал важный момент об условиях гонки в ответах на вопросы Самый быстрый способ проверить, существует ли файл и Как лучше всего проверить, существует ли файл в C? (кроссплатформенный).
Итак, если я открою файл, используя fopen()
в C, и когда он выйдет из строя (по какой-либо причине) и передаст NULL
обратно; тогда я могу дополнительно проверить errno == ENOENT
и довольствоваться этим и правильно сообщить, что файл не существует.
#include <stdio.h>
#include <string.h>
#include <errno.h>
int file_exists(char filename[]) {
int err = 0; //copy of errno at specific instance
int r = 0; //1 for exists and 0 for not exists
FILE *f = NULL;
//validate
if (filename == NULL) {
puts("Error: bad filename.");
return 0;
}
printf("Checking if file %s exists...\n", filename);
//check
errno = 0;
f = fopen(filename, "r");
err = errno;
if (f == NULL) {
switch (errno) {
case ENOENT:
r = 0;
break;
default:
r = 1;
}
printf("errno = %d\n%s\n", err, strerror(err));
} else {
fclose(f);
r = 1;
}
if (r == 0) {
puts("It does not.");
} else {
puts("It does.");
}
return r;
}
errno
действительно то, что вам нужно. Если вы хотите узнать, существует ли файл, то отсутствиеENOENT
не гарантирует этого (вы могли получить другую ошибку, например,EPERM
, или файл мог быть создан как частьfopen
позвонить или ...). Можете ли вы описать немного подробнее, чего вы пытаетесь достичь? - person Sander De Dycker   schedule 05.09.2018