Dans ce (long) TP, nous allons manipuler les fichiers en C.

Le TP devra être terminé pendant la séance libre de la semaine prochaine et l'élève devra envoyer un fichier archive contenant les solutions des exercices à vergnaud@di.ens.fr pour le lundi 23 mars au plus tard.

Exercice 1 - Copie de fichiers

  1. Écrivez un programme C qui copie un fichier grâce aux fonctions bas-niveau read(2) et write(2). Le programme prendra deux arguments sur sa ligne de commande: le nom d'un fichier source existant et un nom du fichier destination. On prendra en particulier soin à:

    • copier par morceaux ni trop gros (pour ne pas saturer la mémoire) ni trop petits (pour minimiser le nombre d'appels systèmes): 64 Ko semble un bon compromis,

    • gérer les erreurs fatales (fichier introuvable, erreur disque, etc.) qu'il faut rapporter à l'utilisateur (errno(3), strerror(3)),

    • gérer les erreurs transitoires (appel système interrompu EINTR, etc.) en recommençant l'opération jusqu'au ce qu'elle réussisse.

  2. Modifiez votre programme pour qu'il respecte les droits et le propriétaire (utilisateur et groupe) du fichier source (de manière similaire à cp -p). (voir stat(2), chown(2), chmod(2)).

    Que se passe-t-il si on essaye de copier un fichier sur lui-même? Modifiez votre programme pour interdire cela. (Attention aux liens symboliques et durs.)

  3. Modifiez votre programme pour que, si le fichier destination contient des noms de répertoires inexistants, ceux-ci soient automatiquement créés (comme avec mkdir -p).

  4. Faites un programme qui copie un répertoire complet, en copiant récursivement ses sous-répertoires (voir opendir(3), readdir(3) et closedir(3)).

top

Exercice 2 - Découpage de fichiers

En utilisant les techniques utilisées dans l'exercice précédent, écrire un programme C qui permet de découper facilement de gros fichiers en des fichiers plus petits et de les reconstruire. Le programme aura les fonctionnalités suivantes :

  • l'utilisateur peut choisir la taille maximale de chaque fichier ;

  • un test d'intégrité des fichiers produits est effectué avant la reconstruction du fichier de départ.

top

Exercice 3 - Disque Usage

À l'aide des fonctions opendir, readdir, closedir et des fonctions stat et lstat, écrire un progamme qui calcule la taille totale d'une arborescence dont la racine est passée en argument (sur le principe de la commande du, Disk Usage).

Attention: si un fichier possède plusieurs liens physiques, il ne faudra compter qu'une seule fois la place occupée.

top

Exercice 4 - Droits utilisateurs

Nous souhaitons écrire une commande permettant de donner aux différents types d'utilisateurs des droits raisonnables sur les fichiers d'une arborescence donnée pour éviter par exemple des aberrations du style:

  • droits plus restrictifs pour le propriétaire que pour son groupe ou pour les autres ;

  • fichier ou répertoire autorisé en lecture à certains utilisateurs dans un répertoire qui leur est inacessble ;

  • fichier de type exécutable interdit en exécution à des utilisateurs ayant par ailleurs le droit de le lire ...


  1. Écrire une fonction int elargir_droits(char *fichier) qui accorde à chaque catégorie d'utilisateurs les droits accordés à une catégorie "inférieure".

  2. Écrire une fonction int restreindre_droits(char *fichier) qui retire à chaque catégorie d'utilisateurs les droits qui ne sont accordés à aucune catégorie "supérieure".

  3. Écrire un programme permettant d'appliquer l'une des deux fonctions précédentes à tous les fichiers d'un répertoire, en fonction d'un paramètre de la ligne de commande.

top