81.3.3.6. ДИРЕКТОРИИ



API для директорий


Создание и удаление

Операции с директориями: создать директорию удалить директорию удалить можно только пустую директорию На самом деле очень интересно посмотреть как работала библиотечная функция по созданию директории в ранней версиях UNIX: Она создавала специальный файл - типа директория Затем делала hard link на саму директорию и на родителя (если только он на root) с именами . и .. Поэтому даже сейчас UNIX позволяет делать hardlinks на директории.
int	mkdir(const char* path, mode_t mode)
int	rmdir(const char* path)


Обход директории

Собственно два основных типа запросов Искать все Искать по маске обход директории FindFirst/FindNext/FindClose/FindRewind 2 уровней
DIR*	opendir(const char*name)
int	dirfd(DIR* dir)			// BSD
struct dirent * readdir(DIR* dir)
int	closedir(DIR* dir)

	// . and .. in directory not warranted
	// may absent or be in center of catalog

struct	direct
{
	ino_t	d_ino;					// UNIX, d_fileno
	off_t	d_off;	// offset to next record
	unsigned short d_reclen;
	unsigned char  d_type;  			// Linix,BSD
			DT_BLK
			DT_CHR
			DT_DIR
			DT_FIFO
			DT_LNK
			DT_REG
			DT_SOCK
			DT_UNKNOWN
			DT_WHT    		// bsd
	char	d_name[256];                           //+
};

void	rewinddir(DIR* dir)		// Non standard
void	seekdir(DIR* dir, long loc)     // Non standard  BSD
long	telldir(DIR* dir)		// Non standard  BSD


int	readdir(int	fd, struct dirent* dirp, unsigned int count); 	// internal
int	getdirents(int fd, struct dirent* dirp, unsigned int count);	// internal
int	readdir_r(DIR* restrict dir, struct dirent* entry, struct dirent** result)
readdir() - thread небезопасная функция, потому что struct dirent* которую она возвращает разделяется всем процессом. И в мультизадачной среде могут быть проблемы. Решение - использовать readdir_r, или написать аналогичную обвязку. Не все системы поддерживают telldir/seekdir. Вообще эти функции возникли в то время когда в UNIX использовалась только одна файловая система, и она имела записи в директории фиксированной длинны. Длинна имени файла была фиксированная и небольшая. Поэтому действия этих функций были аналогичны функции lseek(). А в настоящее время у нас куча файловых систем, многие из которых директорию держат не последовательно а в виде деревьев, соответсвенно реалтизация этих функций сильно затрудненa.


Текущая директория

Операции с текущей директорией выбрать текущую директорию получить текущую директорию Для систем с некорневыми файловыми системами это еще возможна и per volume, либо другими специальными способами (смотри секцию РАБОТА С ПУТЯМИ ниже)
char*	getcwd(char* buf, size_t size)
int	chdir(const char* path)
int	fchdir(int fd)
Windows API: GetCurrentDirectory SetCurrentDirectory UNIX API: getcwd chdir fchdir


Нотификация об изменениях в директории

нотификации о изменениях в директории настроить получить изменения закрыть
int	inotify_init(void)
int	inotify_add_watch(int fd, const char* path, uint32_t mask)
int	inotify_rm_watch(int fd, uint32_t wd)
В Novell Netware возможно управление дисковыми квотами не только на уровне диска, но и на уровне директории. Организация директории Список записей фиксированного размера FAT в некоторых случаях может быть использовано больше 1й записи Список записей переменного размера При удалении дырка уплотнение Граница кластера может пересекаться записью не может пересекаться записью (padding в конце блока) Блоки могут иметь заголовок, а могут и не иметь. Дерево NTFS Апофеоз - ReiserFS 3.x - где все данные на диске входят в одно единственное дерево Список inode Amiga FFS в случае жесткой ссылки она указывает на файл/dir который может находиться в другой директории Что храниться в директории Всегда: Имя указатель на inode Может храниться: Некоторые базовые аттрибуты (типа файл или директория) Длинна файла Windows API: CreateDirectory CreateDirectoryEx RemoveDirectory FindFirstFile FindNextFile FindClose FindFirstChangeNotification FindNextChangeNotification FindCloseChangeNotification UNIX API: mkdir rmdir opendir closedir readdir readdir_r rewinddir seekdir telldir

Index Prev Next