Книга: Операционная система UNIX
Метаданные файла
Метаданные файла
Как уже говорилось, каждый файл помимо собственно данных содержит метаданные, описывающие его характеристики, например, владельцев, права доступа, тип и размер файла, а также содержащие указатели на фактическое расположение данных файла. Метаданные файла хранятся в структуре inode. Часть полей этой структуры могут быть получены с помощью системных вызовов stat(2):
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
int lstat (const char *path, struct stat *buf);
int fstat(int fildes, struct stat *buf);
В качестве аргумента функции принимают имя файла или файловый дескриптор (fstat(2)) и возвращают заполненные поля структуры stat, которые приведены в табл. 2.15.
Таблица 2.15. Поля структуры stat
Поле | Значение |
---|---|
mode_t st_mode |
Тип файла и права доступа |
ino_t st_ino |
Номер inode. Поля st_ino и st_dev однозначно определяют обычные файлы |
dev_t st_dev |
Номер устройства, на котором расположен файл (номер устройства файловой системы) |
dev_t st_rdev |
Для специального файла устройства содержит номер устройства, адресуемого этим файлом |
nlink_t st_link |
Число жестких связей |
uid_t st_uid |
Идентификатор пользователя-владельца файла |
gid_t st_gid |
Идентификатор группы-владельца файла |
off_t st_size |
Размер файла в байтах. Для специальных файлов устройств это поле не определено |
time_t st_atime |
Время последнего доступа к файлу |
time_t st_mtime |
Время последней модификации данных файла |
time_t st_ctime |
Время последней модификации метаданных файла |
long st_blksize |
Оптимальный размер блока для операций ввода/вывода. Для специальных файлов устройств и каналов это поле не определено |
long st_blocks |
Число размещенных 512-байтовых блоков хранения данных. Для специальных файлов устройств это поле не определено |
Для определения типа файла служат следующие макроопределения, описанные в файле <sys/stat.h>:
Таблица 2.16. Определение типа файла
Макроопределение | Тип файла |
---|---|
S_ISFIFO(mode) |
FIFO |
S_ISCHR(mode) |
Специальный файл символьного устройства |
S_ISDIR(mode) |
Каталог |
S_ISBLK(mode) |
Специальный файл блочного устройства |
S_ISREG(mode) |
Обычный файл |
S_ISLNK(mode) |
Символическая связь |
S_ISSOCK(mode) |
Сокет |
Все значения времени, связанные с файлом (время доступа, модификации данных и метаданных) хранятся в секундах, прошедших с 0 часов 1 января 1970 года. Заметим, что информация о времени создания файла отсутствует.
Приведенная ниже программа выводит информацию о файле, имя которого передается ей в качестве аргумента:
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
main(int argc, char *argv[]) {
struct stat s;
char* ptype;
lstat(argv[1] , &s); /* Определим тип файла */
if (S_ISREG(s.st_mode)) ptype = "Обычный файл";
else if (S_ISDIR(s.st_mode)) ptype = "Каталог";
else if (S_ISLNK(s.st_mode)) ptype = "Симв. Связь";
else if (S_ISCHR(s.st_mode)) ptype = "Симв. Устройство";
else if (S_ISBLK(s.st_mode)) ptype = "Бл.устройство";
else if (S_ISSOCK(s.st_mode)) ptype = "Сокет";
else if (S_ISFIFO(s.st_mode)) ptype = "FIFO";
else ptype = "Неизвестный тип";
/* Выведем информацию о файле */
/* Его тип */
printf("type = %sn", ptype);
/* Права доступа */
printf("perm =%on", s.st_mode & S_IAMB);
/* Номер inode */
printf("inode = %dn", s.st_ino);
/* Число связей */
printf("nlink = %dn", s.st_nlink);
/* Устройство, на котором хранятся данные файла */
printf("dev = (%d, %d)n", major(s.st_dev), minor(s.st_dev));
/* Владельцы файла */
printf("UID = %dn", s.st_uid);
printf("GID = %dn", s.st_gid);
/* Для специальных файлов устройств - номера устройства */
printf("rdev = (%d, %d)n", major(s.st_rdev),
minor(s.st_rdev));
/* Размер файла */
printf("size = %dn", s.st_size);
/* Время доступа, модификации и модификации метаданных */
printf("atime = %s", ctime(&s.st_atime));
printf("mtime = %s", ctime(&s.st_mtime));
printf("ctime = %s", ctime(&s.st_ctime));
}
Программа использует библиотечные функции major(3C) и minor(3C), возвращающие, соответственно, старший и младший номера устройства. Функция ctime(3C) преобразует системное время в удобный формат.
Запуск программы на выполнение приведет к следующим результатам:
$ а.out ftype.c
type = Обычный файл
perm = 644
inode = 13
nlink = 1
dev = (1, 42)
UID = 286
GID = 100
rdev = (0, 0)
size = 1064
atime = Wed Jan 8 17:25:34 1997
mtime = Wed Jan 8 17:19:27 1997
ctime = Wed Jan 8 17:19:27 1997
$ ls -il /tmp/ftype.c
13 -rw-r--r-- 1 andy user 1064 Jan 8 17:19 ftype.c
- Работа с файлами
- 5.1.5. Удаление файла
- Эффективная работа с временными файлами сортировки
- Единое имя файла параметров InterBase
- Параметры конфигурационного файла InterBase
- 13. Зарабатываем на своих файлах: файлообменники, загружаеми получаем процент за скачивание
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Создание и открытие файла
- Управление файлами занятий
- Как изменить имя файла или папки?
- Как создавать комментарии к файлам?
- Что такое расширение файла? Откуда Windows знает, какой программой открывать файл?