Como faço para ler um diretório como um arquivo no Unix?
Pergunta
Eu entendo que um diretório é apenas um arquivo no unix que contém os números de inode e os nomes dos arquivos dentro. Como faço para dar uma olhada nisso? Eu não posso usar gato ou menos em um diretório, e abri-lo no vi apenas me mostra uma lista dos arquivos ... há números de inode.
Solução
Uma vez que esta é uma questão de programação (que é uma questão de programação, não é?), Você deve verificar se as funções opendir
, readdir
e closedir
. Estes são parte da Single UNIX Spec.
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
O arquivo dirent.h
deve ter a estrutura que você precisa, contendo no mínimo:
char d_name[] name of entry
ino_t d_ino file serial number
aqui para o manpage readdir
- ele contém links para os outros.
Tenha em mente que a quantidade de informações sobre um arquivo armazenado nas entradas de diretório para que seja mínima. O inode contém em si as coisas que você começa a partir da função stat
, coisas como vezes, tamanho, proprietário, permissões e assim por diante, junto com os ponteiros da mais alta importância para o conteúdo do arquivo real.
Outras dicas
Nos velhos tempos - Versão 7, sistema III, no início System V - você poderia certamente abrir um diretório e ler o conteúdo na memória, especialmente para o antigo sistema de arquivos Unix com números de inode de 2 bytes e um limite de 14 bytes no nome do arquivo.
Como os sistemas de arquivos mais exótico tornou-se mais prevalente, o opendir (), readdir (), closedir () família de chamadas de função teve que ser usado em vez porque analisar o conteúdo de um diretório tornou-se cada vez mais não-trivial.
Finalmente, na última década ou assim, ele atingiu o ponto em que na maioria dos sistemas, você não pode ler o diretório; você pode abri-lo (principalmente para operações como fchdir () pode trabalhar), e você pode usar a família opendir () de chamadas para lê-lo.
Parece que o stat
comando poderia estar em ordem. Do artigo:
stat /etc/passwd
File: `/etc/passwd'
Size: 2911 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 324438 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2008-08-11 05:24:17.000000000 -0400
Modify: 2008-08-03 05:11:05.000000000 -0400
Change: 2008-08-03 05:11:05.000000000 -0400