První operační systémy začínaly s jednoúrovňovým adresářem. Řešil se hlavně formát jména a atributy. Přišly problémy s vyhledáváním a kolizí jmen. Objevily se víceúrovňové adresáře a zavedení relativních odkazů vůči current directory. Jako poslední se objevila koncepce linků, kterou se dotvořil koncept adresářového grafu jak je znám dnes.
Mimochodem, stromovou strukturu adresářů vymysleli v AT&T Bell Labs v roce 1970.
Jako moderní koncepce se dnes ukazuje úplné oddělení adresářové struktury od souborů. Soubory jsou objekty, které obsahují data, programy operují s referencemi. V případě potřeby je pak možno v adresáři svázat takovou referenci se jménem.
Adresářová položka zpravidla obsahuje jméno souboru a atributy jako jsou přístupová práva, čas vytvoření a změny, některé systémy dovolují specifikovat libovolné atributy jako named values.
Základní operace na adresářích jsou otevření a zavření a čtení či prohledávání obsahu. Pro zápis obsahu jsou zvláštní funkce, které vytvářejí, přejmenovávají a mažou adresáře a soubory a nastavují jejich atributy, aby aplikace nemohly poškodit strukturu adresáře.
DIR *opendir (const char *name); int closedir (DIR *dir); struct dirent *readdir (DIR *dir);
Pomocí těchto funkcí je možné číst adresář, zajímavá je samozřejmě struktura dirent. O té ale POSIX standard říká pouze, že bude obsahovat zero terminated jméno souboru a případně inode number, kterému ale říká sériové číslo souboru.
int scandir (const char *dir, struct dirent ***namelist, int (*select) (const struct dirent *), int (*compar) (const struct dirent **, const struct dirent **));
Funkce scandir prohledá adresář a vrátí seznam položek, funkce select říká, které položky uvažovat, funkce compare říká, jak uvažované položky seřadit.
int stat (char *path, struct stat *buf); struct stat { dev_t st_dev; // File device ino_t st_ino; // File inode mode_t st_mode; // Access rights nlink_t st_nlink; uid_t st_uid; // Owner UID gid_t st_gid; // Owner GID dev_t st_rdev; // Device ID for special files off_t st_size; // Size in bytes blksize_t st_blksize; // Block size blkcnt_t st_blocks; // Size in blocks time_t st_atime; // Last access time time_t st_mtime; // Last modification time time_t st_ctime; // Last status change time }
The stat system call provides information about a single directory entry.
HANDLE FindFirstFile (LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData); BOOL FindNextFile (HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData); typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName [MAX_PATH (= 260)]; TCHAR cAlternateFileName [14]; } WIN32_FIND_DATA;
Funkce převzaté z CP/M.