Come faccio a leggere una directory come un file in Unix?
Domanda
Mi rendo conto che una directory è solo un file in UNIX che contiene i numeri di inode ei nomi dei file all'interno. Come faccio a dare un'occhiata a questo? Non posso usare gatto o meno su una directory, e l'apertura nel VI appena mi mostra un elenco dei file ... senza numeri di inode.
Soluzione
Dal momento che si tratta di una questione di programmazione (è è una questione di programmazione, non è vero?), Si dovrebbe verificare le funzioni opendir
, readdir
e closedir
. Questi sono parte della Single UNIX Spec.
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
Il file dirent.h
deve avere la struttura di cui avete bisogno, contenente almeno:
char d_name[] name of entry
ino_t d_ino file serial number
qui per la pagina di manuale readdir
- contiene collegamenti a gli altri.
Tieni presente che la quantità di informazioni su un file memorizzato nelle voci di directory per esso è minimo. L'inode contiene in sé la roba che si ottiene dalla funzione stat
, cose come i tempi, dimensione, permessi, proprietà e così via, insieme a tutte le importanti puntatori al contenuto del file vero e proprio.
Altri suggerimenti
Ai vecchi tempi - Versione 7, System III, all'inizio del System V - si potrebbe davvero aprire una directory e leggere il contenuto in memoria, soprattutto per il vecchio sistema di file Unix, con numeri di inode 2 byte e un limite di 14 byte sul nome del file.
Per quanto i file system più esotiche è diventato più prevalente, l'opendir (), readdir (), closedir () famiglia di chiamate di funzione doveva essere utilizzato, invece, perché l'analisi del contenuto di una directory è diventato sempre più non banale.
Infine, negli ultimi dieci anni o giù di lì, ha raggiunto il punto in cui sulla maggior parte dei sistemi, non è possibile leggere la directory; è possibile aprirlo (in primo luogo in modo da operazioni come fchdir () possono lavorare), ed è possibile utilizzare la famiglia opendir () di chiamate di leggerlo.
Sembra che il comando stat
potrebbe essere in ordine. Dall'articolo:
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