Я только что обнаружил, что FILE*
может ссылаться не только на обычный файл, но и на каталог.В последнем случае fread
завершится неудачей, а errno
будет установлен на 21 (Is a directory)
.
Можно проверить минимальное воспроизведение здесь
#include <stdio.h>
#include <fcntl.h>
#include <assert.h>
#include <errno.h>
int main() {
char const* sz = ".";
int fd = open(sz, O_RDONLY | O_NOFOLLOW); // all cleanup omitted for brevity
FILE* file = fdopen(fd, "rb");
// I would like to test in this line if it is a directory
char buffer[21];
int const n = fread(buffer, 1, 20, file);
if (0 < n) {
buffer[n] = 0;
printf(buffer);
} else {
printf("Error %d", errno); // 21 = Is a directory
}
}
Чтоправильный способ раннего обнаружения того, что мой FILE*
ссылается на каталог, не пытаясь прочитать из него?
EDIT , чтобы отразить повторяющиеся флаги: я хочу проверить на FILE*
, а не имя файла.Проверка только имени файла и последующее его открытие - условие гонки.