Файлові операції POSIX. Збирання інформації про атрибути файлу

Кожен файл має набір характеристик –атрибутів. Набір атрибутів змінюється залежно від файлової системи. Найпоширеніші атрибути файла це:

· ім’я файла;

· тип файла, який звичайно задають для спеціальнх файлів (каталогів, зв’язків тощо);

· розмір файла (зазвичай для файла можна визничити його поточний,а іноді й максимальний розмір):

· атрибути безпеки, що визначають правав доступу до цього файла;

· часові атрибути, до яких належить час створення, останньої модифікації та останнього використання файла.

Для отримання інформації про атрибути файла (тобто про вміст його індексного дескриптора) використовують системний виклик stat().

#include<sys/stat.h>

int stat(const char *path, struct stat *attrs);

Першим параметром є шлях до файла, другим - структура, у яку записуватимуться атрибути внаслідок виклику. Деякі поля цієї структури (всі цілочислові) наведено нижче:

st_mode- тип і режим файла (бітова маска прапорців, зокрема прапорець S_IFDIR встановлюють для каталогів);

st_nlink- кількість жорстких зв’язків;

st_size –розмір файла у байтах;

st_atime, st_mtime, st_ctime – час останнього доступу, модифікації та зміни атрибутів (у секундах з 1 січня1970 року).

Ось приклад відображення інформації про атрибути файла:

struct stat attrs;

stat (“myfile” , &attrs);

if (attrs.st_mode & S_IFDIR)

printf(“myfile є каталогом \n”);

else

printf (“розмір файла: %d\n”, attrs.st_size);

Для отримання такої самої інформації з дескриптора відкритого файла використовують виклик fstat().

int fstat (int fdl, struct stat * attrs);

Файлові операції POSIX. Операції над каталогами

Розглянемо базові операції над каталогами.

Створення нового каталогу. Ця операція створює новий каталог. Він звичайно порожній.

Вилучення каталогу. На рівні системного виклику ця операція дозволена тільки для порожніх каталогів.

Відкриття і закриття каталогів. Каталог, подібно до звичайного файлу, має бути відкритим перед використанням і закритим після. Деякі операції, пов’язані з доступом до елементів, доступні тільки для відкритих каталогів.

Читання елемента каталогу. Ця операція зчитує один елемент каталогу і переміщує поточну позицію на наступний елемент. Використовуючи читання елемента каталогу в циклі, можна обійти весь каталог.

Перехід у початок каталогу. Ця операція переміщує позицію до першого елемента каталогу.

Для створення каталогу використовують виклик mkdir(), що приймає як параметр шлях до каталогу і права доступу.

if(mkdir(“./newdir”,0644)==-1)

printf(“Помилка під час створення каталогу. \n”);

Відкривають каталог викликом opendir(), що приймає як параметр ім’я каталогу:

DIR *opendir(const char *dirname);

Під час виконання opendir() ініціалізується внутрішній покажчик поточного елемента каталогу. Цей виклик повертає дескриптор каталогу – покажчик на структуру типу DIR, що буде використана під час обходу каталогу. У разі помилки повертає NULL.

Для читання елемента каталогу і переміщення внутрішнього покажчика поточного елемента використовують виклик readdir():

struct dirent *readdir((DIR *dirp);

Цей виклик повертає покажчик на структуру dirent, що описує елемент каталогу ( із полем d_name, яке містить ім’я елемента) або NULL, якщо елементів більше немає.

Після закінчення пошуку потрібно закрити каталог за допомогою виклику closedir(). Якщо необхідно перейти до першого елемента каталогу без його закриття, використовують виклик rewinddir(). Обидва ці виклики приймають як параметр дескриптор каталогу.

Наведемо приклад обходу каталогу в POSIX:

DIR *dirp;

struct dirent *dp;

dirp=opendir(“./dir”);

if(!dirp())

{ printf(“ помилка під час відкриття каталогу \n”);

exit(-1);

}

while(dp=readdir(dirp))

{printf(“%s \n”,dp->d_name); // відображення імені елемента}

closedir(dirp);

Розділ 4. Штучний інтелект і інженерія знань

Наши рекомендации