5.1.5. Directory Operations

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.

5.1.5.1. Example: Linux Directory Operations

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.

5.1.5.2. Example: Windows Directory Operations

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.