Lister le repertoires en C

Résolu/Fermé
Noha819 Messages postés 74 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 19 octobre 2023 - 11 août 2009 à 14:44
jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 - 13 août 2009 à 10:08
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);
}

9 réponses

jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 9
11 août 2009 à 15:02
Sans doute faire un "flush" en fin de prg sur le handle avec le quel tu fais tes fprintf ?
0
Noha819 Messages postés 74 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 19 octobre 2023 14
11 août 2009 à 16:14
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.
0
jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 9
11 août 2009 à 16:32
http://beej.us/guide/bgc/output/html/multipage/fflush.html

C'est une fonction qui vide le tampon d'écriture.
En général il devrait être vidé avant de faire un fclose.
0
Noha819 Messages postés 74 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 19 octobre 2023 14
11 août 2009 à 16:45
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!
0
jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 9
11 août 2009 à 16:55
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.
0
jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 9 > jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009
11 août 2009 à 16:59
Note (autre solution plus lourde) :
ouvrir et fermer le fichier de sauvegarde dans 'findfile'.
Dans ce cas il faudra ouvrir le fichier en append "a+".
0
Noha819 Messages postés 74 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 19 octobre 2023 14
11 août 2009 à 17:10
En effet tu a probablement raison je vai tester ta solution DeSuite!!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Noha819 Messages postés 74 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 19 octobre 2023 14
11 août 2009 à 17:34
Super c'est sa merci beaucoup j'ai du l'ouvrir en append en effet!
0
> 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...)
0
sous Win32, tu aurais du utiliser :

la structure WIN32_FIND_DATA et ses fonctions amies FindFirstFile, FindNextFilet et FindClose
0
jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 9
12 août 2009 à 18:23
Sauf si c'est un exercice d'école ;-)
0
Noha819 Messages postés 74 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 19 octobre 2023 14
12 août 2009 à 22:54
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!
0
jean-charles.gibier Messages postés 34 Date d'inscription lundi 10 août 2009 Statut Membre Dernière intervention 18 août 2009 9
13 août 2009 à 10:08
Ok mais donc plus de portabilité.
0