C++: Existuje soubor?
Pokud bych chtěl jsen přečíst data, jde o problém celkem triviální. Stačí se pokusit tento soubor otevřít. Cest je opět několik:
Takový postup bude ve většině případů plně dostačující. Pro úplnost uvedu ještě příklad s využitím funkce access
Co ale dělat v případě, že chceme o souboru zjistit více informací? Je soubor spustitelný? Jaká je jeho velikost? Jaké je ID vlastníka? V takovém případě se můžeme opřít o funkci stat
// Funkce bere jako parametr jméno souboru a ukazatel na strukturu do které má doplnit data
int stat(const char *filename, struct stat *buf);
Obsah struktury jde vyčíst třeba na Wiki
- st_dev - ID zařízení, na kterém je soubor uložen
- st_ino - Číslo inode
- st_mode -Obsahuje práva k souboru
- st_nlink - Počet pevných odkazů
- st_uid - ID vlastníka
- st_gid - ID skupiny ve, které je vlastník
- st_size - Celková velikost v bytech
- st_atime - Čas posledního přístupu k souboru
- st_mtime - Čas poslední změny
- st_ctime - Poslední změna statusu (= změna čísla inode)
Pro další využití bude nejdůležitější obsah st_mode
. Pro testování jeho obsahu jsou zavedeny mimo jiné mimo jiné tyto masky:
- S_IFREG - Jde o soubor
- S_IFLNK - Jde o symbolický odkaz
- S_IFDIR - Jde o adresář
- S_IRUSR - Práva pro čtení vlastníkem
- S_IWUSR - Práva pro zápis vlastníkem
- S_IXUSR - Práva pro spuštění vlastníkem
Krom masek existuje ještě několik maker. Jako jediný parametr m
se jim předává st_mode
. Návratovou hodnotou maker je buď 0, v případě že test neuspěl nebo nenulová hodnota pokud test uspěl.
- S_ISDIR(m) - Jde o adresář
- S_ISFIFO(m) - Jde o rouru nebo speciální soubor FIFO
- S_ISREG(m) - Jde o soubor
- S_ISLNK(m) - Jde o symbolický adresář
Konečně je čas na ukázku použití funkce stat
v akci: