Cliquez ici pour retirer la feuille de style si vous souhaitez imprimer ce document (ou en cas de problème d'affichage).

Préembule

Vous regarderez le petit essai try_file.c qui vous est fourni afin de voir un micro exemple de parcours de repertoires et les types qui y sont associés. Attention, enlevez l'option -ansi pour compiler. Les structures utilisées sont un peu compliqué. Nous allons définir notre propre bibliothèque simplifiées pour représenter et manipuler les fichiers et répertoire de facon plus aisées dans la suite du projet.

La bibliothèque directory.h

Nous allons créér une bibliothèque directory.h qui contiendra la définition d'un type MyDirectory représentant le contenu d'un répertoire comme un ensemble de nom de fichiers.
  1. Changez vos fichiers my_type.h et my_type.c pour avoir comme définition de MyType : typedef char* MyType; Adaptez en conséquence print_mt() et cmp_mt();
  2. Définissez avec un typedef le type TheDirFic comme étant un DynStack
  3. Ajouter une fonction TheDirFic* construct_tdf(char*); qui créée un TheDirFic a partir d'un nom de repertoir en ajoutant dans le tableau dynamique les nomes des fichiers contenus dans le repertoire.
  4. En plus de la liste des fichiers contenus, on aimerait aussi stocker le nom du repertoire...
    • ajouter un structure rassemblant un DynStack et un char* (pour qu'on ait tous les même nom, le champs DynStack s'appelera fns et le champs char* s'appellera dn),
    • modifiez le typedef du type TheDirFic pour que ca soit cette structure,
    • et modifiez en conséquence la fonction construct_tdf() (n'oubliez pas qu'elle doit aussi remplir le champs dn)
  5. Ajoutez les fonction desctruct_tdf() et print_tdf()
  6. dans votre fichier test.c, faites une fonction qui construit un TheDirFic à partir d'un nom de répertoire, l'affiche, et le détruit. Testez !

Séparation des types de fichiers

Nous souhaitons maintenant que les différents types de fichiers (répertoires, fichiers réguliers, liens, autres) soient séparés.
  1. Modifiez la structure pour qu'il y ait non pas un DynStack mais quatres. Plutot que d'avoir 4 champs différents, on utilisera un tableau de 4 DynStack.
    1.  
    2. typedef struct{
    3. DynStack* fl[4];
    4. char * dn;
    5. }TheDirFic;
    6.  
  2. Afin de ne pas s'emmeler les pinceaux avec des indices pour différencier les 4 tableaux (celui qui contient des répertoires, celui qui contient des fichiers texte, celui qui contient des liens et enfin celui qui contient d'autres types de fichiers), vous allez définir une enum : typedef enum{A_DIR=0, OTHER, FIC_OTHER, FIC_TXT} RdType; Pour utiliser le tableau fl d'un TheDirFic appellé tdf, il suffira maintenant d'écrire tdf.fl[A_DIR]; (à la place de tdf.fl[0]).
  3. Modifiez maintenant construct et print pour prendre en compte le fait qu'il y a 4 tableaux ! Attention, sous windows, seul le types répertoire et fichier sont reconnu... regardez dans l'exemple donné comment cela était traité. Vous devez utiliser des macro avec des intitulé prédéfinis :
    • Pour UNIX :
      1.  
      2. #if __unix__||__posix__||__linux__
      3. code specifique a linux
      4. #endif
      5.  
    • Pour Windows
      1.  
      2. #if WIN32
      3. code specifique a windows
      4. #endif
      5.  
    • au cas ou le code est compolé sous MinGW ou d'autres environnement pseudo unix sous windows, ajoutez en haut de votre fichier :
      1.  
      2. #ifndef WIN32
      3. #include <sys/types.h>
      4. #endif
      5.  

Parcourt récurssif

On souhaite maintenant continuer à explorer en profondeur les repertoires fils.
to be continued