Как мне прочитать каталог как файл в Unix? - PullRequest
1 голос
/ 02 ноября 2009

Я понимаю, что каталог - это просто файл в Unix, который содержит номера инодов и имена файлов внутри. Как мне взглянуть на это? Я не могу использовать cat или менее для каталога, и открытие его в vi просто показывает мне список файлов ... без номеров узлов.

Ответы [ 3 ]

8 голосов
/ 02 ноября 2009

Поскольку это вопрос программирования (это - это вопрос программирования, не так ли?), Вам следует проверить функции 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 - она ​​содержит ссылки на другие.

Имейте в виду, что объем информации о файле, хранящемся в записях каталога, для него минимален. Сам инод содержит материалы, которые вы получаете от функции stat, такие как время, размер, владелец, разрешения и т. Д., А также все важные указатели на фактическое содержимое файла.

6 голосов
/ 02 ноября 2009

В старые времена - Версия 7, Система III, ранняя Система V - вы действительно могли открывать каталог и считывать содержимое в память, особенно для старой файловой системы Unix с 2-байтовыми номерами инодов и ограничением в 14 байтов. на имя файла.

Поскольку более экзотические файловые системы стали более распространенными, вместо этого пришлось использовать семейство вызовов функций opendir (), readdir (), closedir (), поскольку анализ содержимого каталога становился все более нетривиальным.

Наконец, в последнее десятилетие или около того, оно достигло точки, когда на большинстве систем вы не можете прочитать каталог; вы можете открыть его (в первую очередь, чтобы могли работать такие операции, как fchdir ()), и вы можете использовать семейство вызовов opendir () для его чтения.

1 голос
/ 02 ноября 2009

Похоже, что 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
...