::Главная страница :: С++/Си :: Статьи {Путь}
Функции mkdir и rmdir в Unix

Директории создаются с помощью функции mkdir() и удаляются посредством функции rmdir().

#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
Return: 0 если OK, -1 при ошибке

Эта функция создает новый пустой директорий. Элементы точка и точка-точка создают-ся автоматически. Указанные права доступа к файлам, mode, модифицируется маской создания файлов процесса. Общая ошибка - указывать такой же режим прав как и для файла (только чтение и за-пись). Но для директория нам надо, по крайне мере, поднять один бит выполнения, чтобы полу-чить доступ к именам файлов внутри директория.

Пользовательский ID и групповой ID нового директория устанавливаются в соответствие с правилами, описанными в разделе "Владельцы новых файлов и директорий".

Пустой директорий удаляется с помощью функции rmdir()

#include <unistd.h>
int rmdir(const char *pathname);
Return: 0, если все OK, -1 при ошибке

Если счетчик ссылок на директорий станет равным нулю вместе с этим вызовом и ника-кой другой процесс не открыл директорий, тогда пространство занимаемое директорием осво-бождается. Если один или более процессов имеют директорий открытым, когда счетчик ссылок достигнет 0, удаляется последняя ссылка, удаляются элементы точка и точка-точка перед тем как функция вернет управление. Однако, директорий не освобождается до тех пор пока послед-ний процесс не закроет его.
Чтение директория

Директорий может быть прочитан любым пользователем у кого имеется права для чте-ния директория. Но осуществить запись в директорий может только ядро (для сохранения рабо-тоспособности файловой системы). Ранее мы выяснили, что биты прав записи и выполнения для директория определяют можем ли мы создавать новые файлы в директории и удалять фай-лы из него - они не указывают можем ли мы записать в сам директорий. Действительный формат директория зависит от реализации Unix. Ранние системы имели очень простую структуру: каждый элемент директория был 16-байтовым: 14 байт для имени и 2 байта для номера I-node. Когда была добавлена поддержка длинных имен файлов, то каждый элемент стал переменной длины, что означало, что любые программы которые читают директо-рий - теперь системо - зависимы. Для упрощения этого, были разработан набор функций для директория и сейчас он является частью стандарта POSIX.1.

#include <sys/types.h>
#include <dirent.h>
DIR * opendir(const char *pathname);
Return: указатель, если все OK, NULL при ошибке
struct dirent *readdir(DIR *dp);
Return: указатель, если все OK, NULL если конец директория или ошибка
void rewinddir(DIR *dp);
int closedir(DIR *dp);
Return: 0, если все OK, -1 при ошибке

Структура dirent определена в файле <dirent.h> и является зависимой от реализации. Но она содержит по крайне мере два элемента.

struct dirent {
int_t d_ino; // номер I-node
char d_name[NAME_MAX+1]; // имя файла
}

Заметим, что константа NAME_MAX зависит от файловой системы в которой размеща-ется директорий и ее значение берется из функции fpathconf(). Частое значение для BSD-систем составляет 255.

Структура DIR это внутренняя структура используемая этими четырьмя функциями для обработки информации о директории, который был прочитан. Указатель на структуру DIR. Указатель на структуру DIR который возвращается функцией opendir(), используется осталь-ными тремя функциями.
Тематические ссылки
Ваша ссылка Ваша ссылка

Обмен кнопками, ведение статистики, реклама.