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);
}
A voir également:
- Lister le repertoires en C
- Liste déroulante en cascade - Guide
- Lister les disques cmd - Guide
- Comment mettre sa liste d'amis en privé sur facebook - Guide
- Gertrude a préparé la liste des affaires à prendre pour l'excursion. juliette a modifié cette liste en utilisant le mode suivi des modifications proposé par le traitement de texte. - Guide
- Comment lister sous dos ses lecteurs de disk - Forum Windows
9 réponses
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.
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!
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
> 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...)
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
la structure WIN32_FIND_DATA et ses fonctions amies FindFirstFile, FindNextFilet et FindClose