Как прочитать каталог как файл в Unix?
Вопрос
Я понимаю, что каталог — это просто файл в Unix, который содержит номера индексных дескрипторов и имена файлов внутри.Как мне на это взглянуть?Я не могу использовать cat или less в каталоге, и открытие его в vi просто показывает мне список файлов... без номеров индексных дескрипторов.
Решение
Поскольку это вопрос программирования (он является вопрос программирования, не так ли?), вам следует проверить opendir
, readdir
и closedir
функции.Они являются частью единой спецификации UNIX.
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
А dirent.h
файл должен иметь нужную вам структуру и содержать как минимум:
char d_name[] name of entry
ino_t d_ino file serial number
Видеть здесь для readdir
manpage — содержит ссылки на другие.
Имейте в виду, что объем информации о файле, хранящийся в записях каталога для него, минимален.Сам индексный дескриптор содержит данные, которые вы получаете из stat
функция, такие вещи, как время, размер, владелец, разрешения и т. д., а также важнейшие указатели на фактическое содержимое файла.
Другие советы
В старые времена — Версия 7, Система III, ранняя Система V — вы действительно могли открыть каталог и прочитать его содержимое в памяти, особенно для старой файловой системы Unix с 2-байтовыми номерами индексных дескрипторов и ограничением размера файла в 14 байт. имя.
Поскольку более экзотические файловые системы стали более распространенными, вместо них пришлось использовать семейство вызовов функций opendir(), readdir(), closedir(), поскольку анализ содержимого каталога становился все более нетривиальным.
Наконец, за последнее десятилетие или около того, дошло до того, что в большинстве систем вы не можете прочитать каталог;вы можете открыть его (в первую очередь для того, чтобы могли работать такие операции, как fchdir()), и вы можете использовать семейство вызовов opendir() для его чтения.
Похоже на stat
команда может быть в порядке.Из статьи:
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