Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лабы_11.doc
Скачиваний:
7
Добавлен:
22.04.2019
Размер:
755.71 Кб
Скачать

Методичні вказівки

1. Створення та видалення каталогу

mkdir () створює порожній каталог

# Include <sys/types.h>

# include <sys/stat.h>

int mkdir (const char * pathname, mode_t mode);

Return: 0 якщо OK, -1 при помилці

Ця функція створює новий порожній каталог. Елементи точка і точка-точка створюються автоматично. Зазначені права доступу до файлів, mode, модифікується маскою створення файлів процесу. Загальна помилка - вказувати такий самий режим прав як і для файлу (тільки читання і запис). Але для директорія нам треба, принаймні, підняти один біт виконання, щоб отримати доступ до імен файлів всередині директорія.

rmdir () видаляє порожній каталог

# Include <unistd.h>

int rmdir (const char * pathname);

Return: 0, якщо все OK, -1 при помилці

Якщо лічильник посилань на каталог стане рівним нулю разом з цим викликом і ніякий інший процес не відкрив каталог, тоді простір займане каталогом звільняється. Якщо один або більше процесів мають каталог відкритим, коли лічильник посилань досягне 0, віддаляється останнє посилання, видаляються елементи точка і точка-точка перед тим як функція поверне управління. Однак, каталог не звільняється до тих пір поки останній процес не закриє його.

2. Читання каталогу

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

Стандартна бібліотека Linux надає два способи перерахування вмісту директорій:

перший - за допомогою функції scandir () і функцій зворотного виклику,

int scandir (const char * dir, struct dirent *** namelist,

int (* select) (const struct dirent *),

int ( * compar) (const struct dirent **, const struct dirent **));

Як функції сортування запропоновані alphasort () і versionsort (), а ось фільтр, так розумію, потрібно писати свій.

другий - з використанням набору функцій opendir (), readdir (), closedir ().

# Include <sys/types.h>

# include <dirent.h>

DIR * opendir (const char * pathname);

Return: покажчик, якщо все OK, NULL при помилку

struct dirent * readdir (DIR * dp);

Return: покажчик, якщо все OK, NULL якщо кінець каталогу або помилка

void rewinddir (DIR * dp);

int closedir (DIR * dp);

Return: 0, якщо все OK, -1 при помилці

Структура dirent визначена у файлі <dirent.h> і є залежною від реалізації. Але вона містить принаймні два елементи.

struct dirent

{int_td_ino; / / номер I-node

char d_name [NAME_MAX +1]; / / ім'я

файлу}

Константа NAME_MAX залежить від файлової системи в якій розміщується каталог та її значення береться з функції fpathconf (). Часте значення для BSD-систем становить 255.

Структура DIR це внутрішня структура, яка використовується для обробки інформації про каталог, який був прочитаний. Покажчик на структуру DIR, який повертається функцією opendir (), використовується рештою функціями.

Розглянемо два варіанти програми printdir, роздруковує вміст директорії, переданої їй як аргумент.

# Include <stdio.h>

# include <dirent.h>

int sel (struct dirent * d)

{return 1; / / завжди підтверджуємо}

int main (int argc, char ** argv)

{inti, n;

struct dirent ** entry;

if (argc! = 2)

{printf ("Використання:% s <директорія> \ n", argv [0]) ;

return 0;}

n = scandir (argv [1], & entry, sel, alphasort);

if (n <0)

{printf ("Помилка читання директорії \ n");

return 1;}

for (i = 0; i <n; i + +)

printf ("% s inode =% i \ n", entry[i]->d_name, entry [i] -> d_ino);

return 0;}

Функція scandir () створює список елементів зазначеної директорії. Їй необхідно передати покажчик на функцію-фільтр, яка, отримуючи дані про чергове елементі, приймає рішення, включати цей елемент в результуючий список. У нашому прикладі це функція sel (). Якщо при черговому виклику функція sel () поверне значення 0, відповідний елемент директорії не буде включений у кінцевий список. Останній параметр scandir - функція сортування елементів директорії. Ми використовуємо функцію alphasort (), сортують елементи в лексикографічному порядку.

Дані про елементи директорії передаються в структурах dirent. Можна було б очікувати, що структури типу dirent містять багато корисної інформації про елементи директорії, але це не так. Крім імені файлу dirent містить номер inode для цього елемента (простим програмами зазвичай не навіщо знати номери inode, але, щоб наш приклад якось відрізнявся від стандартного, ми включаємо цю інформацію). У структури dirent є ще поле d_type типу char *, але воно, як правило, містить null.

Функція scandir () дозволяє нам отримати повний відсортований список елементів директорії за виклик. У нас є можливість використовувати низькорівневі кошти, які можуть виявитися швидше в тому випадку, якщо сортування файлів нам не потрібна.

Розглянемо другий варіант програми:

# Include <stdio.h>

# include <dirent.h>

int main (int argc, char ** argv)

{DIR * d;

struct dirent * entry;

if (argc! = 2)

{printf ("Використання:% s <директорія> \ n ", argv [0]);

return 0;}

d = opendir (argv [1]);

if (d == NULL)

{printf (" Помилка читання директорії \ n ");

return 1;}

while (entry = readdir (d))

printf ("% s inode =% i \ n", entry-> d_name, entry-> d_ino);

closedir (d);

return 0;}

Цей варіант програми використовує функції opendir (), readdir () і closedir (), які працюють з директорією як з файлом. Функція readdir () повертає значення TRUE до тих пір, поки не будуть прочитані всі елементи директорії.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]