- •Содержание
- •Введение.
- •Теоритическая часть.
- •2.2 Получение содержимого каталога
- •2.3 Структура struct dirent
- •2.4 Получение информации о файле
- •Программный код реализации программы для автоматического обновления и вывода информации по указанному каталогу.
- •Заключение.
- •Список литературы.
- •Удаленные электронные ресурсы.
- •Практическая часть.
- •Разработка блок-схемы алгоритма.
- •Прототип системного программного обеспечения для реализации схожей задачи.
2.4 Получение информации о файле
Кроме имен файлов, находящихся в каталоге может понадобиться некоторая дополнительная информация, которая внесла бы ясность в то, что надо делать дальше. По крайней мере, нельзя только по имени отличить файл от каталога.
Функция stat() заполняет структуру struct stat информацией об определенном файле; если вместо имени файла имеется файловый дескриптор, то можно использовать его совместно с fstat(). Если также необходимо обнаруживать символические ссылки, то вместе с именем файла следует использовать lstat().
В отличие от struct dirent, которую возвращает readdir(), struct stat имеет довольно много обязательных стандартных полей:
st_mode – права доступа к файлу (пользователь, группа, остальные) и флаги.
st_ino – порядковый номер файла.
st_dev – устройство, на котором расположен файл.
st_nlink – счетчик числа связей.
st_uid – идентификатор пользователя-владельца файла.
st_gid – идентификатор группы-владельца.
st_size – размер файла в байтах (для файлов regular).
st_atime – время последнего доступа к файлу.
st_mtime – время последней модификации файла.
st_ctime – время создания файла.
Используя макрос S_*() для поля st_mode, можно определить тип файла:
S_ISBLK(mode) – специальный блочный файл? (обычно это блочное устройство).
S_ISCHR(mode) – специальный символьный файл? (обычно это символьное устройство).
S_ISDIR(mode) – каталог?
S_ISFIFO(mode) – UNIX-канал (pipe) или файл типа FIFO?
S_ISLNK(mode) – символическая ссылка?
S_ISREG(mode) – обычный файл?
Функция stat() выполняется достаточно медленно на большинстве файловых систем, поэтому лучше будет хранить эту информацию в памяти на случай, если она понадобится позже.
Пример программы.
#include <errno.h>
#include <dirent.h>
#include <string.h>
#define FOUND 0
#define NOT_FOUND 1
#define READ_ERROR 2
#define OPEN_ERROR 3
#define NOARG 4
int main (int argc, char *argv []) {
struct dirent *dp;
DIR *dirp;
const char *name;
if (argc > 1) {
name = argv [1];
} else {
return NOARG;
}
dirp = opendir(".");
while (dirp) {
errno = 0;
if ((dp = readdir(dirp)) != NULL) {
if (strcmp(dp->d_name, name) == 0) {
closedir(dirp);
return FOUND;
}
} else {
if (errno == 0) {
closedir(dirp);
return NOT_FOUND;
}
closedir(dirp);
return READ_ERROR;
}
}
return OPEN_ERROR;
}
