"> DIRECTORY(3X)

DIRECTORY(3X)

НАЗВАНИЕ
directory: opendir, readdir, telldir, seekdir, rewinddir, closedir - операции над каталогами

СИНТАКСИС

	#include <sys/types.h>
	#include <dirent.h>
	
	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 реализован как макрос, поэтому к нему нельзя применить операцию вычисления адреса функции.