14.4. Чтение содержимого каталога

14.4. Чтение содержимого каталога

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

#include <dirent.h>

DIR * opendir(const char * pathname);

int closedir(DIR * dir);

Системный вызов opendir() возвращает указатель на тип данных DIR, который является абстрактным (как и структура stdio по имени FILE) и которым не следует манипулировать вне библиотеки С. Поскольку каталоги можно открывать только для чтения, нет необходимости определять, в каком режиме открывается каталог, opendir() срабатывает только в случае существования каталога — этот вызов нельзя использовать для создания новых каталогов (для этого служит mkdir()). Закрытие каталога может не сработать только в случае некорректного значения аргумента dir.

После открытия каталога его элементы читаются последовательно до конца каталога.

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

#include <dirent.h>

struct dirent * readdir (DIR * dir);

Вызывающему коду возвращается указатель на структуру struct dirent. Несмотря на то что struct dirent содержит несколько элементов, единственным переносимым элементом является d_name, содержащий имя файла элемента каталога. Остальные элементы struct dirent зависят от системы. Однако интересным является элемент d_ino, содержащий inode-номер файла.

Самой сложной частью этого процесса является определение ошибки. К сожалению, readdir() возвращает NULL, и когда происходит ошибка, и когда в каталоге больше нет элементов. Чтобы различать эти две ситуации, необходимо проверять errno. Эта задача усложняется тем, что readdir() не меняет errno, пока не произойдет ошибка. Это означает, что для корректной проверки ошибок errno необходимо установить перед вызовом readdir() в заранее известное значение (обычно 0). Ниже показана простая программа, записывающая имена файлов текущего каталога в stdout.

 1: /* dircontents.с */

 2:

 3: #include <errno.h>

 4: #include <dirent.h>

 5: #include <stdio.h>

 6:

 7: int main(void) {

 8:  DIR * dir;

 9:  struct dirent * ent;

10:

11:  /* "." - текущий каталог */

12:  if (!(dir = opendir("."))) {

13:   perror("opendir");

14:   return 1;

15:  }

16:

17:  /* установить errno в 0, чтобы можно было выяснить, когда readdir() даст сбой*/

18:  errno = 0;

19:  while ((ent = readdir(dir))) {

20:   puts (ent->d_name);

21:   /* сбросить errno, поскольку puts() может модифицировать ее */

22:   errno = 0;

23:  }

24:

25:  if (errno) {

26:   perror("readdir");

27:   return 1;

28:  }

29:

30:  closedir(dir);

31:

32:  return 0;

33: }

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Блокирование активного содержимого

Из книги Компьютер на 100. Начинаем с Windows Vista автора Зозуля Юрий

Блокирование активного содержимого Веб-страницы могут содержать не только тексты и рисунки, но и специальные программные модули, расширяющие возможности веб-страниц и позволяющие сделать их интерактивными. Однако в то же время этими средствами могут воспользоваться


7.6.1. Просмотр содержимого каталога

Из книги Самоучитель работы на компьютере автора Колисниченко Денис Николаевич

7.6.1. Просмотр содержимого каталога Итак, начнем обзор нашей файловой системы. Откройте окно Мой компьютер (рис. 51) — вы увидите список дисков. Если щелкнуть на произвольном диске один раз, то слева вы увидите сводную информацию о диске — тип файловой системы, полный объем


Изменение типа содержимого

Из книги Microsoft Windows SharePoint Services 3.0. Русская версия. Главы 9-16 автора Лондер Ольга

Изменение типа содержимого Используя InfoPath 2007 изменять шаблон форм, на котором основан текущий тип содержимого. Аналогично изменению шаблона форм для одной библиотеки, важно внимательно отнестись к изменению шаблона формы содержимого типа, так как можно потерять данные


10.1.31. Получение содержимого каталога

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

10.1.31. Получение содержимого каталога Метод класса Dir.entries возвращает массив, содержащий все элементы указанного каталога:list = Dir.entries("/tmp") # %w[. .. alpha.txt beta.doc]Как видите, включаются и элементы, соответствующие текущему и родительскому каталогу. Если они вам не нужны, придется


Подгрузка содержимого Web-страниц

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Подгрузка содержимого Web-страниц Для подгрузки фрагмента содержимого Web-страницы из стороннего файла и вывода его в указанный элемент Web-страницы библиотека Ext Core предлагает метод load объекта Element:<экземпляр объекта


Реализация подгрузки содержимого

Из книги XSLT автора Хольцнер Стивен

Реализация подгрузки содержимого Теоретическая часть главы вышла очень короткой. Значит, больше времени останется на практику!Давайте создадим новый Web-сайт, в котором и реализуем подгрузку содержимого. Его Web-страницы мы изготовим на основе соответствующих Web-страниц


Реализация генерируемого содержимого 

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Реализация генерируемого содержимого  Давайте реализуем генерируемое содержимое на нашем Web-сайте. Мы создадим базу данных, содержащую список всех Web-страниц (файлов с подгружаемым содержимым) с названиями и гиперссылками.— На основе этой базы данных мы будем


Удаление содержимого

Из книги C++. Сборник рецептов автора Диггинс Кристофер

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


26.2.1. Создание содержимого

Из книги Руководство по переходу на Ubuntu 10.04 LTS «Lucid Lynx» автора Неворотин Вадим

26.2.1. Создание содержимого popt может чередовать синтаксический анализ нескольких совокупностей командных строк. Для этого она сохраняет всю информацию о состоянии для определенной совокупности аргументов командных строк в структуре данных poptContext непрозрачного типа,


12.3 Способ отображения содержимого

Из книги Linux программирование в примерах автора Роббинс Арнольд

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


Обзор содержимого книги

Из книги HTML5 для веб-дизайнеров автора Джереми Кит

Обзор содержимого книги Теперь, после обсуждения вопросов «как» и «почему», поговорим о том, что найдет читатель далее в этой книге. Оценки начальная, средняя и высокая для каждой главы позволяют определить уровень знаний читателя, необходимых для успешного усвоения


5.1. Просмотр содержимого каталога

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

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


Модели содержимого

Из книги автора

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