И. Введение

В файловой системе каталоги играют решающую роль в организации и структурировании файлов. Для программного взаимодействия с каталогами операционные системы предоставляют набор системных вызовов для управления каталогами. Среди этих системных вызовов opendir, readdir и Closedir широко используются для выполнения операций с каталогами. Понимание этих системных вызовов важно для разработчиков, работающих с файловыми системами и задачами, связанными с каталогами.

Цель, использование и типичные практики системных вызовов opendir, readdir и Closedir обсуждаются в этой статье. Мы рассмотрим, как эти системные вызовы позволяют разработчикам открывать каталоги, читать записи каталогов и эффективно закрывать потоки каталогов. К концу вы получите полное представление об этих основных действиях с каталогами и их значении для эффективного взаимодействия с файловой системой.

II. Как мы пойдем в этой статье

1- Объяснение функции opendir()

2-Объяснение функции readdir()

3- Объяснение, если функция closeir()

4-Как мы можем их использовать

5-Пример кода для применения того, что мы поняли;)

III. Системный вызов opendir

Открытькаталог()

давайте разберем их и объясним

Структура DIR: представляет собой поток каталога, мы используем его для чтения записей каталога.
*opendir — это функция, открывающая каталог.
>*name :эта функция принимает имя каталога в качестве параметра.

Функция opendir похожа на открытие книги, чтобы начать читать. Вот как это работает:

Рассмотрим книжную полку с несколькими книгами, каждая из которых представляет каталог.
Использование функции opendir аналогично выбору книги с полки для открытия и чтения.

Вы указываете имя каталога, к которому хотите получить доступ, аналогично тому, как вы выбираете книгу по ее названию.
Метод opendir предоставляет указатель, который эквивалентен предоставлению вам закладки, которая поможет вам запомнить страницу. которую вы сейчас просматриваете.
Закладка (указатель) отслеживает ваш прогресс, поэтому, когда вы вернетесь к книге, вы сможете продолжить с того места, на котором остановились.

Указатель ведет к первой записи в каталоге, подобно тому, как вы открываете книгу на первой странице.
Подводя итог, можно сказать, что функция opendir открывает каталог (например, выбирает книгу для чтения), возвращает указатель (аналогично закладке, чтобы помочь вам вспомнить свой прогресс) и размещает вас на первой записи в каталоге (аналогично открытию книги на первой странице).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

В случае успеха_ возвращается указатель на поток каталога

On_error — возвращает NULL

III. readdir()

Параметры:

dirp: это указатель на поток каталогов, полученный из функции opendir. Он представляет каталог, из которого будет прочитана следующая запись.

Функция readdir похожа на перелистывание страниц книги для чтения каждой главы. Вот как это работает:

Предположим, вы открыли книгу и вставили закладку на текущую страницу.
Теперь вам нужно просмотреть книгу глава за главой.
Функция readdir работает аналогичным образом. Он принимает в качестве входных данных поток каталога (например, вашу книгу), который имеет несколько записей каталога.
Функция readdir похожа на перелистывание страниц книги для чтения следующей главы.
Каждый раз, когда вы используете readdir , она возвращает ссылку на следующий элемент каталога в структуре dirent.
Эта ссылка похожа на краткую заметку или резюме главы, которую вы только что прочитали. Метод readdir возвращает NULL в конце книги (потока каталога), чтобы сигнализировать о том, что больше нет глав (записей) для чтения.

В вашей структуре есть несколько полей для доступа к ним

  1. d_ino: это поле представляет номер инода файла. Инод — это структура данных, в которой хранятся метаданные о файле, такие как права доступа, владелец и тип файла.
  2. d_off: значение, сохраненное в d_off, совпадает со значением, возвращаемым функцией telldir в текущей позиции в потоке каталога. Он часто используется для отслеживания позиций в каталоге.
  3. d_reclen: В этом поле указывается размер возвращаемой записи в байтах. Он может не соответствовать размеру определения структуры dirent, поэтому приложения должны использовать значение d_reclen для определения размера записи.
  4. d_type: Это поле содержит значение, указывающее тип файла. Это позволяет приложениям избежать накладных расходов на вызов функции lstat, если им нужно выполнить только определенные действия в зависимости от типа файла.
  • Когда определенные макросы тестирования функций определены (например, _DEFAULT_SOURCE или _BSD_SOURCE), библиотека glibc определяет дополнительные макроконстанты для представления значения, хранящегося в d_type. Эти константы включают в себя:
  • DT_BLK: Заблокировать устройство.
  • DT_CHR: Символьное устройство.
  • DT_DIR: Каталог.
  • DT_FIFO: Именованный канал (FIFO).
  • DT_LNK: Символическая ссылка.
  • DT_REG: Обычный файл.
  • DT_SOCK: сокет домена UNIX.
  • DT_UNKNOWN: Не удалось определить тип файла.

Наконец, структура dirent содержит информацию о записи каталога. Он содержит такую ​​информацию, как номер инода, положение в потоке каталога, размер записи и тип файла. Поле d_type позволяет программам определять тип файла без дополнительных системных вызовов.

Возвращаемое значение:

В случае успеха функция readdir возвращает указатель на структуру dirent, которая представляет следующую запись каталога в потоке каталогов.

On_error. Если записей больше нет или возникает ошибка, возвращается нулевой указатель (NULL).

IV. закрытодир()

Параметры

dirp: это указатель на поток каталогов, полученный из функции opendir. Он представляет поток каталога, который вы хотите закрыть.

Возвращаемое значение

В случае успеха возвращает 0

При ошибке _-1 при сбое.

Пояснение

Closedir используется для закрытия потока каталогов, который ранее был открыт с помощью функции opendir. Его аргументом является ссылка на поток каталога (dirp). Когда вы закончите использовать каталог и вам больше не нужно просматривать его элементы, используйте Closedir для завершения потока каталога. Крайне важно закрыть поток каталогов, чтобы освободить системные ресурсы и обеспечить тщательную очистку. как закрыть книгу.

Как мы можем их использовать?

Я знаю, что вы сейчас запутались, но давайте внесем ясность.

Чтобы использовать функцию opendir(), спросите себя: «Что нужно от меня этой функции, чтобы я мог ее использовать?» Глядя на синтаксис, мы можем сказать, что ему нужно

1: переменная-указатель для сохранения результата функции внутри этой переменной.

2: имя каталога.

Что нужно от меня readdir()?

1: нужна структура для сохранения возвращаемого значения из этой функции

2: имя каталога для чтения

Что мне нужно от меня для функции closeir()?

просто имя режиссера

поэтому, если мы сейчас соберем то, что мы хотим использовать для этих трех системных вызовов, мы обнаружим, что нам нужно

1- инициировать переменную-указатель для хранения возвращаемого значения функции opendir

2- инициировать структуру для сохранения возвращаемого значения функции readdir

Давайте попробуем написать псевдокод для использования этих древовидных функций в нашем коде

Код

здесь мы получили доступ к структуре и проверили файлы и каталоги и напечатали их имена

Результат

В целом, функции opendir, readdir и Closedir предоставляют удобный набор инструментов для работы с каталогами в C, позволяя вам перебирать записи каталогов, получать доступ к их содержимому и безопасно закрывать поток каталогов, когда ваши действия завершены.

Несколько слов от души

Я хотел бы воспользоваться этой возможностью, чтобы выразить искреннюю благодарность всем вам, кто нашел время, чтобы прочитать мой блог. Ваша поддержка и поддержка очень много значили для меня, и я искренне благодарен вам за ваш неизменный интерес к моей работе.

Поскольку я стремлюсь создавать контент, который является одновременно информативным и интересным, я был бы очень признателен за ваши отзывы о моем блоге. Хорошо это или плохо, ваши честные мнения и предложения помогут мне улучшить и предоставить лучший контент в будущем.

Еще раз спасибо за вашу поддержку, и я желаю вам всего наилучшего в ваших начинаниях. Пожалуйста, не стесняйтесь оставлять мне сообщение или комментарий с вашими мыслями и отзывами.

С уважением, Норан❤️