Wie kann ich ein Verzeichnis als Datei im Unix lesen?
Frage
Ich verstehe, dass ein Verzeichnis nur eine Datei in Unix ist, der die Inode-Nummern und Namen der Dateien innerhalb enthält. Wie nehme ich einen Blick auf das? Ich kann nicht verwenden, Katze oder weniger auf einem Verzeichnis, und Öffnungs es in vi zeigt mir nur eine Auflistung der Dateien ... keine Inode-Nummern.
Lösung
Da dies eine Programmierung Frage ist (es ist eine Programmierung Frage, nicht wahr?), Sollten Sie die opendir
Check-out, readdir
und closedir
Funktionen. Diese sind Teil der Single UNIX Spec.
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
Die dirent.h
Datei, um die Struktur, die Sie benötigen haben sollte, mit mindestens:
char d_name[] name of entry
ino_t d_ino file serial number
Siehe hier für die readdir
manpage - es enthält Links zu die andere.
Beachten Sie, dass die Menge an Informationen über eine Datei in den Verzeichniseinträgen für sie gespeichert ist minimal. Die Inode selbst enthält das Material, das Sie aus der stat
Funktion bekommen, Dinge wie Zeiten, Größe, Eigentümer, Berechtigungen und so weiter, zusammen mit den all-wichtigen Hinweisen auf den tatsächlichen Dateiinhalt.
Andere Tipps
In den alten Tagen - Version 7, System III, frühes System V - man könnte in die Tat ein Verzeichnis öffnen und den Inhalt in den Speicher, vor allem für das alte Unix-Dateisystem mit 2-Byte-Inode-Nummern und eine Grenze von 14 Byte gelesen auf den Dateinamen.
Als exotische Dateisysteme häufiger geworden, die opendir (), readdir (), closedir () -Familie von Funktionsaufrufen, Anspielstationen verwendet werden, da der Inhalt eines Verzeichnisses Parsen wurde zunehmend nicht-trivial.
Schließlich ist in den letzten zehn Jahren oder so, hat er den Punkt erreicht, an dem auf den meisten Systemen Sie das Verzeichnis nicht lesen können; Sie können es öffnen (in erster Linie so Operationen wie fchdir () arbeiten können), und Sie können die opendir () -Familie von Anrufen, es zu lesen verwenden.
Es sieht aus wie der stat
Befehl könnte in Ordnung sein. Aus dem Artikel:
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