1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
//Prototypes
DIR *opendir (const char *filename);
struct dirent *readdir (DIR * dirp);
int closedir (DIR * dirp);
//ACTION SUR FICHIER ET REPERTOIRE
//Action sur un repertoire
void action_dir (const char *dir)
{printf("%s/\n", dir);}
//action sur un rep avt parcour de son contenu
void action_dir_pre (const char *root, const char *dir)
{printf("\n-> %s/%s/\n", root, dir);}
//action sur un re apres parcour de son contenu
void action_dir_post (const char *root, const char *dir)
{}
//action sur un fichier
void action_file (const char *file)
{printf("%s\n", file);}
//DEFINITION D'UNE LISTE CHAINEE SIMPLE
typedef struct slist_t
{
char *name;
int is_dir;
struct slist_t *next;
}slist_t;
//PARCOURS RECURSIF DES REPERTOIRES
int recursive_dir (char *root, char *MP3)
{
slist_t *names = NULL;
slist_t *sl;
DIR *FD;
struct dirent *f;
int cwdlen = 32;
char *cwd;
char *new_root;
if (NULL ==(cwd=malloc(cwdlen* sizeof *cwd)))
{
fprintf(stderr, "probleme avec malloc\n" );
exit(EXIT_FAILURE);
}
//Concatenation new_root="root/MP3"
if (root)
{
int rootlen = strlen (root);
int dirnamelen = strlen ("MP3" );
if (NULL == (new_root = malloc((rootlen + dirnamelen +2) * sizeof *new_root)))
{
fprintf (stderr, "probleme avec malloc\n" );
exit (EXIT_FAILURE);
}
memcpy (new_root, root, rootlen);
new_root[rootlen] = '/';
memcpy (new_root + rootlen + 1, MP3, dirnamelen);
new_root[rootlen + dirnamelen + 1] = '\0';
}
else
new_root = strdup ("MP3" );
//obtention du repertoire courant
while (NULL == (cwd = getcwd (cwd, cwdlen)))
{
if (ERANGE != errno)
{
fprintf (stderr, "probleme avec getcwd (errno= '%s')\n",strerror (errno));
exit (EXIT_FAILURE);
}
cwdlen += 32;
cwd = realloc (cwd, cwdlen * sizeof *cwd);
}
chdir ("MP3" );
//Remplissage de la liste avec les noms des fichiers du rep courant
if (NULL == (FD = opendir ("." )))
{
fprintf (stderr, "opendir() impossible\n" );
return (-1);
}
sl = names;
while ((f = readdir (FD)))
{
struct stat st;
slist_t *n;
if (!strcmp (f->d_name, "." ))
continue;
if (!strcmp (f->d_name, ".." ))
continue;
if (stat (f->d_name, &st))
continue;
if (NULL == (n = malloc (sizeof *n)))
{
fprintf (stderr, "Plus assez de memoire\n" );
exit (EXIT_FAILURE);
}
n->name = strdup (f->d_name);
if (S_ISDIR (st.st_mode))
n->is_dir = 1;
else
n->is_dir = 0;
n->next = NULL;
if (sl)
{
sl->next = n;
sl = n;
}
else
{
names = n;
sl = n;
}
}
closedir (FD);
//parcourt les fichiers et repertoire pour action
for (sl= names; sl; sl = sl->next)
{
if (sl->is_dir)
action_dir (sl->name);
else
action_file (sl->name);
}
//parcourt les fichiers et rep pr actoin avt traitement recursif et apres traitement recursif
/* for (sl = names; sl; sl = sl->next)
{
if (sl->is_dir)
{
action_dir_pre (new_root, sl->name);
recursive_dir (new_root, sl->name);
action_dir_post (new_root, sl->name);
}
}
*/
//Nettoyage
free (new_root);
while (names)
{
slist_t *prev;
free (names->name);
prev = names;
names = names->next;
free (prev);
}
chdir (cwd);
free (cwd);
return(0);
}
int main (int argc, char **argv)
{
if (argc >= 1)
recursive_dir (NULL, argv[1]);
exit (0);
} |