Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO_Курсовой_Мальцева.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
510 Кб
Скачать
☆

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;

}