indicador de tipo de arquivo, sys / st_mode stat.h valor de código de arquivo regular

StackOverflow https://stackoverflow.com/questions/1041616

  •  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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top