super-tupapau | Voila j'ai ajouter tous les tests sur les pointeurs et les mallocs (dite le moi si j'en ai oublié) et j'ai aussi mit en place la récursivité:
Code :
- /* DISKCLEAN --[ Trieur/Nettoyeur de dossier personnel ]-- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <dirent.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- /* DISKCLEAN
- STRUCTURE --[ diskc_arch ]--
- Structure chainée
- */
- struct arch
- {
- char *name;
- char *chemin;
- char *type;
- int level;
- };
- typedef struct arch diskc_arch;
- /* DISKCLEAN
- FONCTION --[ diskc_readir ]--
- Lecteur de dossier récursif.
- Retourne un pointeur sur
- tableau des fichiers présent
- dans le dossier spécifié
- en argument.
- */
- diskc_arch **
- diskc_readir (const char *directory, int *nb_file, diskc_arch ** last_list,
- int level, int *pos)
- {
- /* Tableau des fichiers analysées */
- diskc_arch **list = NULL;
- /* Nombre de fichier analysée */
- int nb = 0;
- /* Niveau d'analyse */
- int this_level = level;
- if (last_list != NULL)
- {
- list = last_list;
- }
- /* Structure stat */
- struct stat info;
- /* Ouverture du répertoire */
- DIR *dir = opendir (directory);
- if (dir != NULL)
- {
- struct dirent *entry = NULL;
- int i = *nb_file;
- /* Lecture du dossier */
- while ((entry = readdir (dir)) != NULL)
- {
- if (strcmp (entry->d_name, "." ) != 0
- && strcmp (entry->d_name, ".." ) != 0)
- {
- nb++;
- void *tmp = realloc (list, (nb + *nb_file) * sizeof *list);
- if (tmp != NULL)
- {
- list = tmp;
- list[i] = malloc (sizeof (diskc_arch));
- if (list[i] != NULL)
- {
- /* Compléter les informations du fichiers: nom, chemin, pointeur suivant, pointeur précédent */
- list[i]->name = strdup (entry->d_name);
- list[i]->chemin = strdup (directory);
- /* Chemin du fichier */
- char *chemin = NULL;
- chemin = strdup (directory);
- chemin =
- realloc (chemin,
- strlen (chemin) + 1 +
- sizeof (entry->d_name));
- if (chemin != NULL)
- {
- strcat (chemin, entry->d_name);
- if ((stat (chemin, &info)) >= 0)
- {
- if (S_ISDIR (info.st_mode))
- {
- list[i]->type = "Dossier";
- }
- else
- {
- list[i]->type = "Fichier";
- }
- list[i]->level = this_level;
- }
- else
- {
- printf
- ("impossible de récupérer les information de %s\n",
- chemin);
- return NULL;
- }
- free (chemin);
- }
- else
- {
- printf ("impossible d'allouer (chemin)\n" );
- return NULL;
- }
- i++;
- }
- else
- {
- printf ("impossible d'allouer (list[%i])\n", i);
- return NULL;
- }
- }
- else
- {
- printf ("impossible d'allouer (list)\n" );
- return NULL;
- }
- }
- }
- closedir (dir);
- if (nb_file != NULL)
- {
- *nb_file = *nb_file + nb;
- }
- /* Récursivité */
- if( pos != NULL ){
- int j = *pos;
- while (j < *nb_file)
- {
- if (list[j]->type == "Dossier" && list[j]->level == this_level)
- {
- /* Chemin du fichier */
- char *chemin = NULL;
- chemin = strdup (directory);
- chemin = realloc (chemin, sizeof (*chemin) + NAME_MAX+1 + 1); /* on ajoute 1 pour le / */
- if (chemin != NULL)
- {
- strcat (chemin, list[j]->name);
- strcat (chemin, "/" );
- list = diskc_readir (chemin, nb_file, list, this_level+1, pos);
- free (chemin);
- }
- else
- {
- printf ("impossible d'allouer (chemin)" );
- return NULL;
- }
- }
- j++;
- }
-
- *pos = j;
- }
- else{
- printf("impossible de récupérer la position dans le dossier" );
- return NULL;
- }
- }
- else
- {
- printf ("impossible d'ouvrir le répertoire: %s\nVérifiez si vous avez les droits d'accès sur ce dossier.\n", directory);
- }
- return list;
- }
- /* DISKCLEAN
- FONCTION --[ main ]--
- Appeler par le systeme
- Aucun arguments
- */
- int
- main (int argc, char **argv)
- {
- int i;
- diskc_arch **file = NULL;
- /* Nombre de fichier analysé */
- int nb_file = 0;
- int pos = 0;
- if (argv[1] != NULL)
- {
- file = diskc_readir (argv[1], &nb_file, NULL, 0, &pos);
- if (file != NULL)
- {
- for (i = 0; i < nb_file; i++)
- {
- printf ("[%s N°%i][LEVEL]:%i:%s%s\n", file[i]->type, i, file[i]->level, file[i]->chemin,
- file[i]->name);
- }
- for (i = 0; i < nb_file; i++)
- {
- free (file[i]->name);
- free (file[i]->chemin);
- free (file[i]);
- }
- }
- else
- {
- return EXIT_FAILURE;
- }
- }
- else
- {
- return EXIT_FAILURE;
- }
- return EXIT_SUCCESS;
- }
|
note: le programme est tres lent sur de tres gros dossier ( logic ) or il serait preferable qu'il soit plus rapide vu qu'il a pour objectif de rechercher les fichiers en double. enfin il a planter sur mon dossier home apres une 20 de seconde:
la glib me signalant un double free. il y a un test faux ds mon programme? Message édité par super-tupapau le 01-11-2005 à 23:16:31
|