Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания Редакция 1.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
100.42 Кб
Скачать

Варианты заданий.

  1. Написать программу, которая создает файл, создает каталог и перемещает созданный файл в каталог. Распечатать содержимое каталога на экран

  2. Написать программу, которая создает каталог, переименовывает его, и переносит в него любой файл.

  3. Написать программу, которая создает два файла, один каталог. Перенести в каталог два файла, один из них переименовать.

  4. Написать программу создания каталога и файла. Распечатать содержимое текущего каталога. Удалить созданный каталог.

  5. Написать программу, которая создает 3 файла и 2 каталога. Удалить один каталог, переименовать второй каталог и перенести в него 2 файла. Распечатать содержимое текущего каталога не экран до и после перемещения.

  6. Написать программу, которая создает 3 каталога. переместить в каталоги по одну любому файлу. Переименовать каталог. Удалить все файлы в одном каталоге.

Контрольные вопросы.

  1. Что такое файл? Его компоненты.

  2. Какие функции удаления файла вы знаете?

  3. Как можно переместить файл?

  4. Расскажите о семействе функций chmod().

ЛАБОРАТОРНАЯ РАБОТА № 6

РАБОТА С КАТАЛОГАМИ

Цель работы: изучить системные вызовы для работы с каталогами. Научиться получать данные об элементах каталога.

Порядок выполнения работы.

  1. Написать программу, осуществляющую просмотр содержимого каталога. Предусмотреть обработку ошибок и наличие параметров.

  2. Откомпилировать программу, и запустить и получить результаты.

  3. Продемонстрировать преподавателю корректную работу программы и «спровоцировать» нештатные ситуации, в результате которых программа выдает сообщения об ошибке.

  4. Ответить на контрольные вопросы.

  5. Составить отчет. Краткая теория.

Все UNIX-системы, включая Linux, используют для хранения файловой информации на диске одну и ту же концепцию. Хотя ее реализация разнообразна, на уровне языка Си интерфейс остается постоянным, давая возможность писать переносимые программы, которые компилируются и запускаются на разных системах.

Каталог в UNIX ‑ это специальный дисковый файл. Вы можете читать его из своих программ. Однако никто, включая суперпользователя, не может записывать что-либо в каталог при помощи write. Изменения содержимого каталогов выполняет только ядро, отвечая на запросы в виде системных вызовов creat, unlink, link, mkdir, rmdir, rename, mknod и др.

Создание и удаление каталогов

Для создания и удаления каталогов предназначены системные вызовы mkdir() и rmdir():

#include <sys/types.h>

#include <sys/stat.h>

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

#include <unistd.h>

int rmdir ( const char *pathname);

Оба возвращают 0 при успехе и -1 в случае неудачи. Аргумент mode представляет права доступа для каталога. Он полностью идентичен аргументам mode для create() и open() (см. лаб. раб. №5). Перед удалением каталог должен быть пуст (содержит только «.» и «..»).

Чтение каталогов

Элементы каталогов представлены с помощью структуры:

struct dirent

{ . . .

ino_t d_ino; /* номер индекса */

char d_name[ . . .]; /* завершающийся нулем массив байт – имя файла */

. . .

}

Для переносимости POSIX использует лишь поле d_name, размер которого не должен превышать NAME_MAX байтов (константа определена в <limits.h>). Следующие функции предоставляют интерфейс для чтения каталогов:

#include <sys/types.h>

#include <dirent.h>

DIR *opendir ( const char *pathname); /*открыть каталог для чтения*/

struct dirent *readdir(DIR *dir); /* вернуть struct dirent за раз */

int closedir(DIR *dir); /* закрыть открытый каталог */

void rewinddir (DIR dirp); /* вернуться в начало каталога */

Тип DIR является аналогом типа FILE в <stdio.h>. Его содержимое не предназначено для пользовательских программ, а используется только другими функциями каталогов. Если opendir возвращает NULL, каталог не может быть открыт для чтения, а errno содержит код ошибки.

Открыв переменную типа DIR *, можно использовать ее для получения указателя на struct dirent, представляющего элемент каталога. Вызов readdir() возвращает NULL, если достигнут конец каталога или произошла ошибка.

Пример использования указанных функций для отображения содержимого каталога:

char *dir;

DIR *d;

struct dirent elem;

. . .

if ((d = opendir(dir)) == NULL)

{printf("%s: %s: cannot open directory for reading: %s\n",

argv[0], dir, strerror(errno));

exit (-1); }

while ((elem = readdir(d)) != NULL

printf(" %8ld %s\n", elem->d_ino, elem->d_name);

if (errno !=0)

{printf("%s: %s: reading directory entries: %s\n", argv[0], dir, strerror(errno));

exit (-1);

}

if (closedir(d) != 0)

{printf("%s: %s: closedir: %s\n", argv[0], dir, strerror(errno));

exit (-1); }

Смена каталога осуществляется функцией chdir(char *NAME) , где NAME имя каталога, куда хотим зайти.