Type de fichier

Dans le TP3 nous avons créé nos 4 tableaux dynamiques contenant les dir, other, fic_other et fic_text.

On va tester uniquement les fichiers lus afin de savoir s'ils sont fichiers textes ou autres.

Pour cela Unix fournit une commande "file" qui permet de savoir le type de fichier car cela est codé dans le fichier. Mais malheureusement sous Windows il n'y a pas de moyen simple pour détecter le type de fichier.

Comme nous voulons un programme qui fonctionne sur les 2 systèmes, nous allons palier ce problème en détectant nous même le type de fichier.

Si en lisant les n (≈ 50) premiers octets ils sont tous "caractères lisibles" alors il y a des chances que le reste le soit aussi.

Vous ferez donc une fonction isTxt() qui reçoit un fichier lu dans le readdir en paramètre, l'ouvre, lit les n 1 er caractères, et vérifie qu'ils sont tous lisibles. Bien sûr à la fin, n'oubliez pas de fermer le fichier. nota : les octets lisibles sont dans la table ascii et, "grosso modo", commence avec ' ' = 0X20, et vont jusqu'à ° = 0XA7. C'est évidement un choix arbitraire (on pouvait aller jusqu'à 2 = 0XFD). A vous de choisir des limites "intelligentes".

Vous utiliserez pour ouvrir, lire, et fermer les fichiers les fonctions fopen, fread et fclose.

Grâce à cette fonction vous allez pouvoir remplir soit la table de FIC_OTHER ou celle de FIC_TXT. nota bis : fread renvoie le nbr. d'octets lus. Donc si vous en demandez 50 et qu'il n'y en a que 20, il vous ramènera 20 octets. Attention à entenir compte, voir : man fread.

 

Descente récurssive

Il reste maintenant à faire un programme qui parcours toutes les dir. trouvées en cours de parcours. Ce que l'on appel une descente récursive.

Pour cela, nous voulons que la DynStack des repertoire ne contiennent pas des MyType comme défini jusqu'a présent, mais des TheDirFic.

Nous allons donc modifier le type MyType, pour qu'il soit non plus simplement un alias de char*, mais une structure contenant un char* et un TheDirFic*.

Les MyType que l'on ajoutera dans les DynStack des fichiers auront le champs de type TheDirFic* à NULL, tandis que ceux destinés au DynStack des répertoires auront le champs de type char* à NULL.

  1. Adaptez votre code et vérifiez qu'il fonctionne toujours sans descente récurssive
  2. faites un beau dessin pour etre sur que vous avez compris ce que l'on souhaite faire
  3. modifiez le constructeur de TheDirFic pour que dans le cas des répertoires, il créé un nouveau TheDirFic et ajoute son adresse a la bonne DynStack. Attention, le nom du TheDirFic devra être le chemin complet depuis le répertoire initial (Par exemple si vous traitez le repertoire toto et qu'il contient un repertoire tata, le nom du TheDirFic correspondant à tata devra être toto/tata, et pas juste tata).

nota :  Attention à ne pas prendre "." et ".." qui sont la dir. courante et la parente.

 

Affichage en couleur !

Lors de l'affichage la différence entre les types de tableaux n'est pas immédiatement visible. Vous trouverez ici un petit programme d'exemple d'affichage en couleur sur Unix et Windows (bien sûr les couleurs ne sont pas identiques et n'ont pas le même nom ). Profitez-en pour coloriser l'affichage de vos tableaux. Vous allez mettre en œuvre vos talents graphiques. Ceci est une nouvelle fonctionnalité, donc nouveau .h et .c et modification du makefile.

 

Finalement, le programme !

Faites un programme qui prend en paramètre un répertoire dir_root et un nom de fichier (ou répertoire) fic,  et indique si fic exsite dans l'arborescence de dir_root.

Ajoutez les fonctionnalités de votre choix à votre programme, par exemple, 

  • affichage récurssif de tous les fichiers contenus dans dir_root, avec spécifié ou non une profondeur maximale 
  • affichage de statistiques sur le nombre de fichiers, leurs tailles, etc.
  • ...

Bravo , vous avez fini !!!

Rendu

En plus des consignes du premier rendu qui s'appliquent toujours, vous ajouterez un fichier userdoc contenant la documentation utilisateur de votre programme (ce que doit savoir un utilisateur lambda pour l'utiliser) et un fichier devdoc contenant la documentation developpeur (ce qu'un developpeur doit savoir pour étendre les fonctionnalitées du programme). Vous joindrez également une copie d'écran de l'exécution de votre programme.

Nota1 : vous n'oublierez pas de commenter votre code quand vous le rendrez. Un code non commenter ne vaut rien. 

Nota2 : pour faire une archive

  1. utiliser un repertoire racine, par exemple projet_nom1_nom2/ qui contient les repertoires et fichiers demandés (src/ bin/, doc makefile etc.)
  2. se placer juste au dessus
  3. taper la commande tar xcf projet_nom1_nom2.tgz projet_nom1_nom2/

Nota 3 : N'oubliez pas votre nom, dans les fichiers doc  !! Pour être certain, ajoutez le en début de tous vos fichiers *.h et *.c.