Lister le repertoires en C
Résolu
Noha819
Messages postés
74
Date d'inscription
Statut
Membre
Dernière intervention
-
jean-charles.gibier Messages postés 34 Date d'inscription Statut Membre Dernière intervention -
jean-charles.gibier Messages postés 34 Date d'inscription Statut Membre Dernière intervention -
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
- Ajoutez à la liste de contacts ana le goff, inscrite le 27 novembre 2015, dans la catégorie i. puis triez les contacts en les classant : par ordre alphabétique de leur nom de famille (critère principal), puis par date du plus récent au plus ancien (critère secondaire). quel mot apparaît à la verticale dans la colonne "catégorie" entre les lignes 200 et 209 (en-tête compris) ? ✓ - Forum Word
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