indicador de tipo de arquivo, sys / st_mode stat.h valor de código de arquivo regular
-
22-07-2019 - |
Pergunta
Eu estou tentando identificar tipos de arquivo para entradas de diretório (Windows Unix etc ..).
Em sys / stat.h o nybble alta ordem da palavra st_mode têm os valores codificados:
#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 */
A partir do comentário parece que o nybble poderia ser 0 ou 8 para representar um arquivo 'regular'.
Então, isso levanta a questão: em que circunstâncias é 0 e não 8? Se eu tivesse definido esses códigos, eu teria reservado 0 a inidicate desconhecido / indefinido / inválido / não-a-arquivo ou algo parecido.
Na verdade, a macro S_ISREG é:
#define S_ISREG(m) ((m) & S_IFREG)
Isto parece-me indicar que um arquivo regular deve sempre de esperar para ter o código de 8 (e 0 seria uma aberração?).
Seria uma suposição válida para interpretar 0 como um desconhecido ou arquivo inválido e ignorar o comentário 'ou apenas 0x0000' e sempre esperar 8 a ser usado para todos os arquivos regulares?
Solução
A maioria das fontes indicam que a verificação S_ISREG é suficiente; Eu não tenho certeza quando você veria 0x0000 como um arquivo "regular".
Eu acredito que algumas implementações de idade usado 0x0000 (a pesquisa realmente velho cabeçalho DJGPP transforma isso), mas é a única verdadeira referência eu posso encontrar. Tudo o resto aponta para 0x8000.
Basicamente, use a macro S_ISREG e esperança de que o cabeçalho sobre o que você está compilando contra faz a coisa certa.
Outras dicas
eu confiaria as definições de S_IFREG e S_ISREG. Eu nunca trabalhei com um sistema de arquivos que quebrou essas macros.
Meu palpite é que a definição 0x0000 para um arquivo regular é lidar com sistemas de arquivos legado que pode ter usado uma codificação diferente de informações de tipo de arquivo. O sistema operacional e sistema de arquivos que você está usando?