Индикатор типа файла, sys / stat.h st_mode обычное значение кода файла - PullRequest
4 голосов
/ 25 июня 2009

Я пытаюсь определить типы файлов для записей каталога (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 будет использоваться для всех обычных файлов?

Ответы [ 2 ]

1 голос
/ 25 июня 2009

Большинство источников указывают, что проверки S_ISREG достаточно; Я не уверен, когда вы увидите 0x0000 как «обычный» файл.

Я полагаю, что некоторые старые реализации использовали 0x0000 (действительно старый поиск в заголовке DJGPP показывает это), но это единственная реальная ссылка, которую я могу найти. Все остальное указывает на 0x8000.

По сути, используйте макрос S_ISREG и надейтесь, что заголовок того, против чего вы компилируете, делает правильно.

0 голосов
/ 25 июня 2009

Я бы доверял определениям S_IFREG и S_ISREG. Я никогда не работал с файловой системой, которая ломала эти макросы.

Я предполагаю, что определение 0x0000 для обычного файла предназначено для обработки устаревших файловых систем, которые могли использовать другую кодировку информации о типе файла. Какую ОС и файловую систему вы используете?

...