exo_06 2. Émulation partielle de la commande ls -la sur un répertoire
Dans cet exercice
vous vous servirez de man 2 chdir(), man 3 opendir(), man 3 readdir(), man 2 lstat(), ainsi que de quelques macros et
masques, et puis de man 3 closedir(),
pour écrire un main() qui
énumère le contenu d'un répertoire argv[1] ainsi
drwx 4096 .
drwx 4096 ..
-rw- 645 Makefile
-rw- 1016 exo_06.h
-rw- 1489 exo_06.cxx
-rw- 28704 exo_06.o
drwx 4096 sousRepertoire
-rwx 17440 exo_06.run
lrwx 10 lienSymbolique
.rw- 0 ceciEstBienUnePipe
Le premier caractère indique le type de l'élément du
répertoire. Nous utilisons le '.' pour tout ce qui n'est pas
répertoire, lien symbolique ou fichier. De même, seulement les
droits d'accès pour le propriétaire sont affichés, suivis
de la taille en octets (comme auparavant).
Quoi de neuf
- opendir() -- pour ouvrir un
répertoire, accessible ensuite par le biais d'un pointeur vers DIR -- un "directory stream" (wrapper OpenDir()).
- readdir() -- pour parcourir
un répertoire ainsi ouvert, élément par
élément (un par appel, avance "toute seule" d'un appel à l'autre).
Rend un pointeur vers une structure dirent, dont le membre d_name
contient le nom de l'élement courant du répertoire. Rend le pointeur nul à la fin du
parcours. Il faut donc l'appeler de manière répétée
pour obtenir tous les éléments (wrapper ReadDir()).
struct dirent {
ino_t d_ino; /* numero d'inoeud */
off_t d_off; /* decalage jusqu'a la dirent suivante */
unsigned short d_reclen; /* longueur de cet enregistrement */
unsigned char d_type; /* type du fichier */
char d_name[256];/* nom du fichier */
};
closedir() -- pour fermer
le DIR (wrapper CloseDir()).
lstat() -- même chose que
stat(), mais sans poursuivre les liens
symboliques
tests, où mode
est la valeur du champ st_mode d'une
struct stat remplie par lstat()
- macros
- S_ISDIR(mode) -- vrai
s'il s'agit d'un répertoire
- S_ISREG(mode) -- vrai
s'il s'agit d'un fichier normal
- masques -- à tester avec le ET binaire
- S_IFLNK & mode -- vrai s'il s'agit
d'un lien symbolique
- S_IRUSR & mode -- vrai si le
propriétaire a le droit de lire
- S_IWUSR & mode -- vrai si le
propriétaire a le droit d'écriture
- S_IXUSR & mode -- vrai si le
propriétaire a le droit d'exécution