172c \documentclass[a4paper,10pt]{article} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[francais]{babel} \usepackage{a4,graphicx} \usepackage{indentfirst,fancyhdr} \usepackage[rdkeywords,index]{listings} \setlength{\textwidth}{18cm} \setlength{\textheight}{24cm} \setlength{\hoffset}{-2.5cm} \setlength{\voffset}{-2.5cm} \lhead{1ere Candidature Informatique (Groupe 5): Projet 4} \chead{} \rhead{Henry Ledoux} \lfoot{\thepage} \cfoot{} \rfoot{21 Décembre 2001.} \addtolength{\headheight}{14pt} \pagestyle{fancy} \begin{document} \lstset{language=c++,basicstyle=\small,commentstyle=\itshape,stringstyle=\ttfamily,stringspaces=false} \title{Projet 6} \author{Henry Ledoux} \date{21 Décembre 2001} \maketitle \section*{Problème} Le problème posé est constitué de deux étapes. En premier lieu il s'agit de créer les classes nécessaires à l'élaboration d'une structure semblable à un systeme de fichier, composée d'un répertoire racine pouvant contenir un ou plusieurs répertoires, chacun de ces répertoires peut en contenir d'autres, mais chacun peut contenir un ou plusieurs fichiers, eux-mêmes contiennent une liste de chaine de caracteres. L'implémentation de cette structure doit se faire à l'aide de listes liées, de la manière suivante: \begin{itemize} \item Un système de fichier unique contenant un répertoire seul (répertoire racine). \item Chaque répertoire est composé d'une liste simple circulaire de sous-répertoire, d'une liste simple circulaire de fichiers et d'un nom \item Chaque fichier est composé d'une liste doublement liée circulaire de chaines de caractères et d'un nom. \end{itemize} Il est bien entendu nécessaire de créer les méthodes permettant la manipulation du systeme de fichier (création de répertoires, fichiers et ajout de chaines en début et fin de fichier). Dans la seconde partie du problème, on demande d'écrire deux méthodes pour le systeme de fichier: la premiere doit afficher tous les fichiers et répertoires dont le nom complet\footnote{Le nom complet est l'ensemble du chemin d'accès et du nom du fichier.} contient une chaine donnée en paramètrla seconde doit afficher tous les fichiers dont le contenu (une des chaines de caracteres de la liste) contient une chaine donnée en paramètre. \section*{Structure} Le système de fichier contient un et un seul répertoire (la racine), spécifié par {\itshape Directory *root} , et un pointeur vers le répertoire courant (dans lequel on ajoutera les fichiers grace a {\itshape InsereFileInCur()} ou encore les répertoires via {\itshape InsereRepInCur()} ). Chaque répertoire, contient une liste de répertoires désignée par {\itshape Directory* sub} contenant au moin l'élément vide\footnote{Premier élément de la liste, qui n'est pas considéré ou élément "bidon"} (qui lui ne contient pas de liste de répertoire, le pointeur sub vaut NULL), un pointeur {\itshape parent} pointant vers le répertoire parent (ceci afin de faciliter le parcours de la hiérarchie); et bien entendu un pointeur {\itshape next} pointant vers le répertoire suivant dans le meme niveau de sous-répertoire. Il contient également une liste (simple ciculaire) de fichiers (désignée par {\itshape File* first\_file}. Les fichiers, contiennent une liste circulaire doublement liée de chaines de caractères ({\itshape String* str\_list}) Chacun de ces éléments contient un nom (simple chaine de caractere) utilisé poru la manipulation de ceux-ci. Le schéma ci-dessous illustre un exemple d'un tel systeme. \section*{Description des méthodes} {\itshape void File::AddStringT(char contenu[])} et {\itshape void File::AddStringB(char contenu[])} permettent respectivement d'ajouter une chaine de caractère en début ou en fin de fichier. {\itshape void FileSystem::Cdd(char nom[])} modifie le répertoire courant vers le répertoire spécifié par nom (non simple, et non le nom complet). {\itshape void FileSystem::InsereRepInCur(char nom[])} et {\itshape void InsereFileInCur(char nom[])} permettent d'insérer respectivement un répertoire ou un fichier dans le répertoire courant. {\itshape void FileSystem::SearchName(char chain\_a\_chercher[])} et {\itshape void SearchStr(char chaine\_a\_chercher[])} recherchent tous les fichiers dont le nom (pour SearchName) ou le contenu (pour SearchStr) contient la chaine\_a\_chercher. {\itshape void FileSystem::DispCur()} affiche le répertoire courant a l'écran. \section*{Exemple d'execution} Voici un exemple d'utilisation du programme: \begin{lstlisting}{} void main() { FileSystem* fsys; fsys = new FileSystem(); fsys->InsereRepInCur("essai1"); // Cree un repertoire fsys->Cdd("essai1"); // Se place dans le repertoire essai1 fsys->InsereRepInCur("essai2"); fsys->Cdd("essai2"); fsys->InsereRepInCur("essai3"); fsys->Cdd("essai3"); fsys->InsereRepInCur("boul"); fsys->OpenFile("boul")->AddStringT("bilili"); // Ajoute une chaine en début de fichier fsys->Cdd(".."); fsys->InsereRepInCur("essai4"); fsys->Cdd("essai4"); fsys->InsereFileInCur("testfile"); fsys->InsereFileInCur("mooh"); fsys->OpenFile("testfile")->AddStringT("ijlikiklazersf"); fsys->OpenFile("testfile")->AddStringB("milili"); cout << "Recherche le mot il dans le contenu des fichiers" << endl; fsys->SearchStr("il"); cout << "Recherche les fichiers dont le nom contient oh" << endl; fsys->SearchName("oh"); cout << "Affiche toute la hiérarchie" << endl; fsys->SearchName(""); } \end{lstlisting}{} Sortie écran: \begin{verbatim} Recherche le mot il dans le contenu des fichiers /essai1/essai2/essai4/testfile Recherche les fichiers dont le nom contient oh /essai1/essai2/essai4/mooh Affiche toute la hiérarchie /essai1/ /essai1/essai2/ /essai1/essai2/essai4/mooh /essai1/essai2/essai4/testfile /essai1/essai2/essai4/ /essai1/essai2/essai3/ /essai1/essai2/essai3/boul/ \end{verbatim} \section*{Le code} \lstinputlisting{main.cpp} \end{document} 0