Индикатор типа файла, sys / stat.h st_mode обычное значение кода файла
-
22-07-2019 - |
Вопрос
Я пытаюсь определить типы файлов для записей каталога (Windows Unix и т. д.).
В файле sys / stat.h высший разряд слова st_mode имеет закодированные значения:
#define S_IFDIR 0x4000 /* directory */
#define S_IFIFO 0x1000 /* FIFO special */
#define S_IFCHR 0x2000 /* character special */
#define S_IFBLK 0x3000 /* block special */
#define S_IFREG 0x8000 /* or just 0x0000, regular */
Из комментария кажется, что nybble может быть 0 или 8 для представления «обычный файл».
Таким образом, возникает вопрос: при каких обстоятельствах это 0, а не 8? Если бы я определил эти коды, я бы зарезервировал 0, чтобы указать неизвестный / неопределенный / недействительный / не-файл или что-то в этом роде.
Действительно, макрос S_ISREG:
#define S_ISREG(m) ((m) & S_IFREG)
Мне кажется, это указывает на то, что обычный файл должен всегда следует иметь код 8 (а 0 будет аббревиатурой?).
Допустимо ли интерпретировать 0 как неизвестный или недействительный файл и игнорировать комментарий 'или просто 0x0000' и всегда ожидать, что 8 будет использоваться для всех обычных файлов?
Решение
Большинство источников указывают, что проверки S_ISREG достаточно; Я не уверен, когда вы увидите 0x0000 как "обычный" файл. Р>
Я полагаю, что некоторые старые реализации использовали 0x0000 (действительно старый поиск в заголовке DJGPP показывает это), но это единственная реальная ссылка, которую я могу найти. Все остальное указывает на 0x8000.
По сути, используйте макрос S_ISREG и надейтесь, что заголовок того, против чего вы компилируете, делает правильно.
Другие советы
Я бы доверял определениям S_IFREG и S_ISREG. Я никогда не работал с файловой системой, которая сломала эти макросы.
Я предполагаю, что определение 0x0000 для обычного файла предназначено для обработки устаревших файловых систем, которые могли использовать другую кодировку информации о типе файла. Какую ОС и файловую систему вы используете?