Problème allocation mémoire
Bonjour, j'ai un souci d'allocation mais je ne sais pas du tout comment y remédier, en fait, je liste le contenu du dossier path, je sépare les dossier des fichiers ( j'ai enlevé l'étape des fichiers pour alléger le code). En fait, lorsque je veux lister le contenu du /home ( il y a 990 dossiers :aie: ), j'ai un peu du n'importe quoi qui s'affiche a l'ecran, bref, manque de place. Si je liste le contenu de mon dossier personnel en revanche, je n'ai aucun souci. Comment savoir combien de place je dois allouer ?
Au passage, si vous avez des critiques/ remarques sur mon code, elles sont les bienvenues ;)
Code:
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
| int listerDossier(char *path, Fichier *list_fichier)
{
// Declaration
const char *regex="^\\.[[:alnum:]]+"; // Expression permettant de supprimer les fichiers caches
DIR *dir;
Fichier *dossiers;
int d_i;
int i,j;
int nb_fichier= 0;
regex_t preg;
struct dirent *ptrent;
struct stat st;
// Allocation
dossiers= (Fichier *)malloc(NB_FICHIER_MAX*BUFFER*sizeof(Fichier));
// Ouverture du dossier
if(stat(path, &st) == 0)
{
if(S_ISDIR(st.st_mode))
{// Evite le favicon.ico
if((dir= opendir(path)) == NULL)
{
perror("Dossier inexistant ou non autorise en lecture\n");
exit(errno);
}
d_i= 0;
while((ptrent= readdir(dir)) != NULL)
{
// Prend le chemin absolu du fichier
char abs[254];
sprintf(abs, "%s%s", path, ptrent->d_name);
if((stat(abs, &st)) < 0)
{
perror("Erreur de stat\n");
exit(errno);
}
if((regcomp(&preg, regex, REG_EXTENDED | REG_NOSUB)) == 0)
{// Compilation de la regex
if((regexec(&preg,ptrent->d_name,0,NULL,0)) != 0)
{// Execution de la regex
regfree(&preg);
if((strcmp(ptrent->d_name, "..")) == 0)
{// Repertoire parent en tete de liste
list_fichier[0].nom= ptrent->d_name;
list_fichier[0].type= 'p';
}
else if((strcmp(ptrent->d_name, ".")) == 0)
{ /* On enleve le repertoire courant */ }
else if(S_ISDIR(st.st_mode))
{
dossiers[d_i].nom= ptrent->d_name;
dossiers[d_i].type= 'd';
dossiers[d_i].taille= st.st_size;
dossiers[d_i].modif= st.st_mtime;
d_i++;
nb_fichier++;
}
}
}
}
closedir(dir);
}
}
printf("Nombre d'elements: %d \nNombre de dossiers: %d\n", nb_fichier, d_i);
// Triage des dossiers et fichiers par ordre alphabetique
qsort(dossiers, (size_t) d_i, sizeof(dossiers[0]), compare);
// Rajout des dossiers et fichiers dans le pointeur final
for(i=1, j=0; i <= d_i; i++, j++)
{
list_fichier[i].nom= dossiers[j].nom;
list_fichier[i].type= dossiers[j].type;
list_fichier[i].modif= dossiers[j].modif;
}
// Liberation de l'espace memoire
free(dossiers);
return nb_fichier;
} |