Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Функция

readdir
возвращает указатель на структуру, содержащую следующий элемент каталога в потоке каталога
dirp
. Успешные вызовы
readdir
возвращают следующие элементы каталогов. При возникновении ошибки и в конце каталога
readdir
возвращает
NULL
. Системы, удовлетворяющие стандарту POSIX, возвращая
NULL
, не меняют переменную
errno
в случае достижения конца каталога и устанавливают ее значение, если обнаружена ошибка.

#include <sys/types.h>

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

Просмотр

каталога с помощью функции
readdir
не гарантирует формирование списка всех файлов (и подкаталогов) в каталоге, если в это время выполняются другие процессы, создающие и удаляющие файлы в каталоге.

В состав структуры

dirent
, содержащей реквизиты элемента каталога, входят следующие компоненты.

ino_t d_ino
— индекс файла;

char d_name[]
— имя файла.

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

stat
, который мы обсуждали ранее.

telldir

Функция

telldir
возвращает значение, регистрирующее текущую позицию в потоке каталога. Вы можете использовать ее в последующих вызовах функции
seekdir
для переустановки просмотра каталога, начиная с текущей позиции.

#include <sys/types.h>

#include <dirent.h>

long int telldir(DIR *dirp);

seekdir

Функция

seekdir
устанавливает указатель на элемент каталога в потоке каталога, заданном в параметре
dirp
. Значение параметра
loc
, применяемого для установки позиции, следует получить из предшествующего вызова функции
telldir
.

#include <sys/types.h>

#include <dirent.h>

void seekdir (DIR *dirp, long int loc);

closedir

Функция

closedir
закрывает поток каталога и освобождает ресурсы, выделенные ему. Она возвращает 0 в случае успеха и -1 при наличии ошибки.

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

В приведенной далее программе printdir.c (упражнение 3.4) вы соберете вместе множество функций обработки файлов для создания простого перечня содержимого каталога.

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

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

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

Для того чтобы познакомиться с методами повышения универсальности программ, посмотрите исходный код таких утилит Linux, как

ls
и
find
.

Упражнение 3.4. Программа просмотра каталога

1. Начните с соответствующих заголовочных файлов и функции

printdir
, которая выводит содержимое текущего каталога. Она будет рекурсивно вызываться для вывода подкаталогов, применяя параметр
depth
для задания отступа.

#include <unistd.h>

#include <stdio.h>

#include <dirent.h>

#include <string.h>

#include <sys/stat.h>

#include <stdlib.h>

void printdir(char *dir, int depth) {

 DIR *dp;

 struct dirent *entry;

 struct stat statbuf;

 if ((dp = opendir(dir)) == NULL) {

fprintf(stderr, "cannot open directory: %s\n", dir);

return;

 }

 chdir(dir);

 while((entry = readdir(dp)) != NULL) {

lstat(entry->d_name, &statbuf);

if (S_ISDIR(statbuf.st_mode)) {

/* Находит каталог, но игнорирует . и .. */

if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0)

continue;

printf("%*s%s/\n", depth, "", entry->d_name);

/* Рекурсивный вызов с новый отступом */

printdir(entry->d_name, depth+4);

} else printf("%*s%s\n", depth, " ", entry->d_name);

 }

 chdir("..");

 closedir(dp);

}

2. Теперь переходите к функции

main
.

int main {

Поделиться:
Популярные книги

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

Виконт. Книга 1. Второе рождение

Юллем Евгений
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.67
рейтинг книги
Виконт. Книга 1. Второе рождение

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Бояръ-Аниме. Газлайтер. Том 30

Володин Григорий Григорьевич
30. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 30

Двойник короля 12

Скабер Артемий
12. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 12

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Как я строил магическую империю 9

Зубов Константин
9. Как я строил магическую империю
Фантастика:
постапокалипсис
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Как я строил магическую империю 9

Адвокат Империи 12

Карелин Сергей Витальевич
12. Адвокат империи
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 12

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Виконт. Книга 3. Знамена Легиона

Юллем Евгений
3. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Виконт. Книга 3. Знамена Легиона

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9