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 ), 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
}