Status d'un fichier

 

Récupérer le status d'un fichier va permettre de récupérer des informations concernant le fichier.

Ces informations étant par exemple le périphérique où se trouve le fichier, les droits d'accès, le propriétaire, la taille ou encore les dates...

Il n'est pas nécessaire d'avoir les droits d'accès au fichier pour obtenir les informations. Cependant, il faudra les avoir sur les répertoires qui permettent d'aboutir au fichier.

 

Les fonctions en C

Voici tout d'abord les includes pour les fonctions C qui suivent:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

Il y a en tout 3 fonctions pour récupérer le status d'un fichier:
int stat(const char *file_name, struct stat *buf);

file_name est une chaîne de caratères indiquant où trouver le fichier.

buf est une adresse pointant sur une structure stat. buf recevant les informations sur le status du fichier s'il n'y a pas eu d'erreur lors de l'accès.

Image non trouvée !Si vous demandez le status d'un fichier qui se trouve être un lien symbolique, vous obtiendrez le status du fichier pointé par ce lien, et non le status du lien lui-même.

int lstat(const char *file_name, struct stat *buf);
Fonction identique à stat. Il y a quand même une différence (sinon, la fonction serait inutile):lstat pour link status. Contrairement à stat, si vous demandez le status d'un lien, vous obtiendrez bien le status de ce lien et non du fichier pointé par le lien.


int fstat(int filedes, struct stat *buf);

Fonction identique à stat, sauf que l'on indique plus le nom d'un fichier, mais un descripteur de fichier que l'on aura obtenu par exemple via la fonction open.

Dans les 3 cas, les fonctions retournent une structure stat contenant les champs suivants :

struct stat {

dev_t st_dev; /* Périphérique */
ino_t st_ino; /* Numéro i-noeud */
mode_t st_mode; /* Protection, type de fichier, ...*/
nlink_t st_nlink; /* Nb liens matériels */
uid_t st_uid; /* UID propriétaire */
gid_t st_gid; /* GID propriétaire */
dev_t st_rdev; /* Type périphérique */
off_t st_size; /* Taille totale en octets du fichier, pour un lien, taille du nom du fichier visé (sans le 0 à la fin !) */
blksize_t st_blksize; /* Taille de bloc pour E/S, taille qui serait la plus intéressante pour ne pas faire trop d'accès au disque */
blkcnt_t st_blocks; /* Nombre de blocs alloués (taille du fichier en blocs de 512 octets)*/
time_t st_atime; /* Heure dernier accès (par une fonction comme exec(2), mknod(2), pipe(2), utime(2) et read(2) sur au moins 1 octet */
time_t st_mtime; /* Heure dernière modification (par une focntion touchant au moins un octet du fichier comme par exemple mknod(2), truncate(2), utime(2) et write(2). Pour un répertoire, ce champ sera modifié lors de la création, suppression d'un fichier ou lien */
time_t st_ctime; /* Heure dernier changement suite à une écriture, une lecture, ou une modification de données concernant l'i-noeud (propriétaire, groupe, mode, etc...) */
};

Image non trouvée !Les systèmes de fichiers de Linux n'implémentent pas tous les champs "time". Certains systèmes de fichiers autorisent le montage de telle manière que les accès ne modifient pas le champ st_atime (voir l'option `noatime' de mount(8)).

Les macros POSIX pourrons permettre de vérifier le type de fichier. Il suffira de leurs passer le champ st_mode.

Nous pouvons aussi récupérer les droits d'accès toujours via le champ st_mode (voir aussi tester les droits d'accès).

Pour plus de détail sur le champ st_mode, voir information sur le fichier


En sortie, ces fonctions peuvent retourner 0 si pas d'erreur, ou -1. Dans ce cas, errno contient:

Valeur Désignation
EBADF filedes est un mauvais descripteur.
ENOENT Un composant de file_name n'existe pas, ou il s'agit d'une chaine vide.
ENOTDIR Un composant du chemin d'accès n'est pas un répertoire.
ELOOP Trop de liens symboliques rencontrés dans le chemin d'accès.
EFAULT Un pointeur se trouve en dehors de l'espace d'adressage.
EACCES Autorisation refusée.
ENOMEM Pas assez de mémoire pour le noyau.
ENAMETOOLONG Nom de fichier trop long

 

Un exemple:

Petit programme qui a besoin d'un nom de fichier en paramètre. En sortie, il affichera le type du fichier (répertoire, fichier normal, ...)

Image non trouvée !

C'est simple non ?

 

Dans celui-ci, nous afficherons le propriétaire du fichier (UID), ainsi que son groupe (GID) et les droits d'accès:

Image non trouvée !