Bonjour à tous!
Je développe actuellement un projet qui est une sorte de 'ls', prenant en paramètre un dossier, ayant pour but de lister les fichiers et sous dossiers en regroupant les fichiers par utilisateur et en calculant le nombre de fichiers et la taille totale de ses fichiers.
Je prends un exemple :
Code :
- quentin@quentin:~$ ./a.out test
- test/: quentin (#2, 8000 Bytes) root (#1, 100 Bytes)
- test/test2: quentin (#4, 200 Bytes)
|
puis un deuxième pour mettre en évidence la prise en compte des sous-dossiers
Code :
- quentin@quentin:~$./a.out -s test
- test/: quentin (#6, 8200 Bytes) root (#1, 100 Bytes)
- test/test2: quentin (#4, 200 Bytes)
|
Dans le premier exemple, 'quentin' possède 2 fichiers dans test/. Il affiche donc 2.
Dans le second, quentin possède 2 fichiers dans test/, mais il affiche 6 car il a pris en compte le sous-dossier test/test2.
Pour l'instant, voici comment je procède :
J'ai créé une structure arbre pour représenter l'ensemble des fichiers / dossiers :
Code :
- typedef struct Leaf
- {
- struct File *file;
- struct Leaf *parent; // pointeur vers le noeud père
- struct Leaf *next; // pointeur vers le noeud suivant au même niveau
- struct Leaf *child; // pointeur vers le fils
- } Leaf;
- typedef struct Tree
- {
- Leaf *first;
- } Tree;
|
Après avoir parcouru tous les dossiers et sous dossier et stocké tous les fichiers dans l'arbre (avec les bonnes relations parent / child / next), je 'parse' le résultat.
J'ai réussi à faire l'exemple 1, c'est à dire sans la prise en compte des sous-dossiers ainsi :
Code :
- void parseTree (Tree *tree)
- {
- if (tree == NULL)
- printf("The tree is empty!n" );
- else
- parseTreeRec2 ((tree->first)->child, ((tree->first)->file)->fullname); // Je passe en paramètre le premier 'child' du tree, qui correspond au premier fichier du dossier 'racine', mais également le fullpath du dossier parent (ici, le dossier racine) (Ce 2ème paramètre sert juste pour l'affichage par la suite)
- }
- void parseTreeRec (Leaf *leaf, char *path)
- {
- if (leaf != NULL)
- {
- // J'alloue une liste qui sera donc remplie d'utilisateur unique avec comme attribut un nombre de fichier et la taille totale
- List *l;
- l = malloc (sizeof (List));
- initList (l);
-
- Leaf *current = leaf;
- while (current != NULL)
- {
- // J'ajoute l'utilisateur du fichier parcouru (il y a une méthode pour vérifier la présence de cet utilisateur, auquel cas on met juste a jour les attributs 'nombre de fichiers' et 'taille totale'
- addUser (l, (current->file)->owner, 1, (current->file)->size);
- parseTreeRec2 (current->child, (current->file)->fullname);
- current = current->next;
- }
- // Une fois le dossier est fini d'être parcouru, j'affiche la liste
- printf ("%s: ", path);
- displayList (l);
- }
- }
|
Jusqu'ici, tout va bien. Maintenant, les choses se complique. Il faut que je puisse prendre en compte les sous-dossiers pour chaque dossier ...
J'ai pensé à passer une liste en paramètre à un fonction similaire à "parseTreeRec" qui se mettrait à jour avec les valeurs des sous dossiers. Seulement cela signifie qu'il me faut créer une liste par dossier et je ne vois pas comment faire cela en conservant la récursivité ...
J'espère ne pas avoir été trop "brouillon" ...
Par avance, Merci à ceux qui tenteront de me comprendre 
Message édité par Ydalb le 17-11-2010 à 18:57:04
---------------
:o