Lister le repertoires en C
Résolu
Noha819
Messages postés
109
Statut
Membre
-
jean-charles.gibier Messages postés 34 Statut Membre -
jean-charles.gibier Messages postés 34 Statut Membre -
Bonjour, je suis sous windows et je code en C.
Voila mon probleme: je fait un bout de code qui est censé me faire un fichier texte dans lequel il liste tout les repertoires et sous repertoires d'un dossier sous la forme
"K:\SAVE\Sauvegarde\*CHAINE EMPLACEMENT REP*"
par exemple:
"K:\SAVE\Sauvegarde\c\Documents and Settings\All Users\Menu Démarrer\Programmes\PhotoFiltre"
Sa marche nickel pendant l'execution, ensuite il me fait bien le fichier texte le chemin d'acces est OK sauf que il ne m'enregistre qu'une partie dans le txt! Pourtant quand je fait un printf en mode console, il m'affiche la totalité!!! En clair, je ne compren pas pourquoi ce qui ce trouve dans mon txt est 3 fois plus petit que ce que je vois sur ma fenetre en console!
Ya til un blem avec mon fprintf? aidez moi SVP
Voici le code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
void findfile(char dossier[5000]);
int main (int argc, char *argv[]) {
findfile("c:\\Documents and Settings\\All Users\\");
}
void findfile(char dossier[5000])
{
char ssdossier[5000], tmp[5000] = "", dosstmp[5000] = "K:\\SAVE\\Sauvegarde\\";
struct dirent *lecture;
FILE* test;FILE* saverep = NULL;
int taillechaine = 0, i=0, t=0;
DIR *rep;
rep = opendir(dossier);
saverep = fopen("C:\\saverep.lst", "w");
while ((lecture = readdir(rep)))
{
if(!strcmp(lecture->d_name,".") || !strcmp(lecture->d_name,"..")) continue;
sprintf(ssdossier,"%s%s\\",dossier,lecture->d_name);
if (opendir(ssdossier) != NULL)
findfile(ssdossier);
taillechaine = strlen(ssdossier);
taillechaine--;
memset (tmp, 0, sizeof (tmp));
strncpy (tmp, ssdossier, taillechaine);
strcpy (ssdossier, tmp);
test = fopen(ssdossier, "r");
if(test == NULL)
{
i=0;
while(i <= 3)
{
if(ssdossier[i] == ':')
{
while(ssdossier[i] != '\0')
{
ssdossier[i] = ssdossier[i+1];
i++;
}
}
else i++;
}
fprintf(saverep, "%s%s\n",dosstmp , ssdossier);
printf("%s\n",ssdossier);
}
}
closedir(rep);
}
Voila mon probleme: je fait un bout de code qui est censé me faire un fichier texte dans lequel il liste tout les repertoires et sous repertoires d'un dossier sous la forme
"K:\SAVE\Sauvegarde\*CHAINE EMPLACEMENT REP*"
par exemple:
"K:\SAVE\Sauvegarde\c\Documents and Settings\All Users\Menu Démarrer\Programmes\PhotoFiltre"
Sa marche nickel pendant l'execution, ensuite il me fait bien le fichier texte le chemin d'acces est OK sauf que il ne m'enregistre qu'une partie dans le txt! Pourtant quand je fait un printf en mode console, il m'affiche la totalité!!! En clair, je ne compren pas pourquoi ce qui ce trouve dans mon txt est 3 fois plus petit que ce que je vois sur ma fenetre en console!
Ya til un blem avec mon fprintf? aidez moi SVP
Voici le code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
void findfile(char dossier[5000]);
int main (int argc, char *argv[]) {
findfile("c:\\Documents and Settings\\All Users\\");
}
void findfile(char dossier[5000])
{
char ssdossier[5000], tmp[5000] = "", dosstmp[5000] = "K:\\SAVE\\Sauvegarde\\";
struct dirent *lecture;
FILE* test;FILE* saverep = NULL;
int taillechaine = 0, i=0, t=0;
DIR *rep;
rep = opendir(dossier);
saverep = fopen("C:\\saverep.lst", "w");
while ((lecture = readdir(rep)))
{
if(!strcmp(lecture->d_name,".") || !strcmp(lecture->d_name,"..")) continue;
sprintf(ssdossier,"%s%s\\",dossier,lecture->d_name);
if (opendir(ssdossier) != NULL)
findfile(ssdossier);
taillechaine = strlen(ssdossier);
taillechaine--;
memset (tmp, 0, sizeof (tmp));
strncpy (tmp, ssdossier, taillechaine);
strcpy (ssdossier, tmp);
test = fopen(ssdossier, "r");
if(test == NULL)
{
i=0;
while(i <= 3)
{
if(ssdossier[i] == ':')
{
while(ssdossier[i] != '\0')
{
ssdossier[i] = ssdossier[i+1];
i++;
}
}
else i++;
}
fprintf(saverep, "%s%s\n",dosstmp , ssdossier);
printf("%s\n",ssdossier);
}
}
closedir(rep);
}
Configuration: Windows XP Internet Explorer 7.0
9 réponses
-
Sans doute faire un "flush" en fin de prg sur le handle avec le quel tu fais tes fprintf ?
-
Merci de tinteresser jean charles!
Mais tu pourrais m'en dire un pàeu plus je sais pas ce qu'est un fluch!!! Je vais me renseigner. -
Oui tu a raison on doi faire un ffluch normalement!
Mais dans mon cas sa ne regle pas mon blem!!! Quand je fait un fclose ou un ffluch ou meme les deux il y a encor 2 fois moins de texte dans mon fichier de sauvegarde!!!
Jy compren rien!! HELP!-
Dans ce cas c'est un problème d'algoritmie ;-)
Je n'ai pas testé mais si je ne m'abuse ta procédure est récusive et il me semble que tu ouvres ton fichier de sauvegarde à chaque fois que ta fonction est appelée, c'est ce qui doit probablement perturber ta sauvegarde.
Théoriquement tu ne sauvegarde que le dernier repertoire :-)
Moralité : il faut faire passer le pointeur de ton fichier de sauvegarde dans les paramètres de ta fonction récursive et n'ouvrir/fermer ta sauvegarde qu'en debut/fin de programme.
-
-
En effet tu a probablement raison je vai tester ta solution DeSuite!!!
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Super c'est sa merci beaucoup j'ai du l'ouvrir en append en effet!
-
> Bonjour, je suis sous windows et je code en C.
Alors il ne faut pas utiliser dirent mais les apis Windows (c'est leur but...) -
sous Win32, tu aurais du utiliser :
la structure WIN32_FIND_DATA et ses fonctions amies FindFirstFile, FindNextFilet et FindClose -
-
Nan c pas un exercice d'ecole c'est une partie d'un pitit prog que je realise mais laurent a raison,
mais la raison pour laquel je n'ai pas utilisé l'api windows c que je my suis pas encor beaucoup penché et le l'utilise vraiment le minimum mais j'y viendrai!!! Merci a tous!