DIRECTORY(3X) DIRECTORY(3X) НАЗВАНИЕ directory: opendir, readdir, telldir, seekdir, rewinddir, closedir - операции над каталогами СИНТАКСИС |#include |#include | |DIR *opendir (filename) |char *filename; | |struct dirent *readdir (dirp) |DIR *dirp; | |long telldir (dirp) |DIR *dirp; | |void seekdir (dirp, loc) |DIR *dirp; |long loc; | |void rewinddir (dirp) |DIR *dirp; | |void closedir (dirp) |DIR *dirp; ОПИСАНИЕ Функция opendir открывает каталог с именем filename и связывает с ним поток каталога. Opendir возвращает в качестве результата указатель, который используется в последующих операциях для идентификации потока катало- га. Пустой указатель возвращается, если файл filename не доступен или не является каталогом, либо, если ко- манда malloc(1M) не может выделить достаточного объема памяти для структуры типа DIR или для буферов. Функция readdir выдает указатель на следующий активный элемент каталога. Указатели на неактивные элементы ка- талога не выдаются. При достижении конца каталога или при выявлении некорректной позиции в каталоге возвраща- ется пустой указатель. Функция telldir выдает текущую позицию в указанном по- токе каталога. Функция seekdir устанавливает позицию для последующей операции readdir над потоком каталога. Данная позиция совпадает с той, которая была получена в результате вы- полнения операции telldir, вычислившей loc. Значения, которые возвращает telldir, корректны только в том слу- чае, если каталог не сжимался и не расширялся. Такая проблема не возникает в случае версии 5, но может воз- никнуть для некоторых других типов файловых систем. Операция rewinddir переустанавливает в начало позицию в указанном потоке каталога. Операция closedir закрывает указанный поток каталога и освобождает структуру DIR. При выполнении перечисленных операций могут возникнуть следующие ошибки: opendir: [ENOTDIR] Компонент маршрутного имени filename не яв- ляется каталогом. [EACCES] Для компонента маршрутного имени filename отсутствует право на поиск. [EMFILE] Будет превышено максимально допустимое чис ло описателей файлов. [EFAULT] Аргумент filename указывает за пределы от- веденного процессу адресного пространства. readdir: [ENOENT] Текущая позиция каталога не соответствует корректному элементу. [EBADF] Описатель файла, определенный аргументом dirp, в данный момент некорректен. Возмож- ная причина - поток был закрыт. telldir, seekdir и closedir: [EBADF] Описатель файла, определенный аргументом dirp, в данный момент некорректен. Возмож ная причина - поток был закрыт. ПРИМЕР Приведем фрагмент программы для поиска в каталоге эле- мента name: |dirp = opendir ("."); |while ((dp = readdir (dirp)) != NULL) | if (strcmp (dp->d_name, name) == 0) { | closedir (dirp); | return FOUND; | } |closedir (dirp); |return NOT_FOUND; СМ. ТАКЖЕ getdents(2), dirent(4). ПРЕДОСТЕРЕЖЕНИЯ Rewinddir реализован как макрос, поэтому к нему нельзя применить операцию вычисления адреса функции.