Accueil > > > SCANDISC SIMPLE POUR LISTER LE CONTENU D'UN REPERTOIRE (+ DES SOUS-REPERTOIRES....)
SCANDISC SIMPLE POUR LISTER LE CONTENU D'UN REPERTOIRE (+ DES SOUS-REPERTOIRES....)
Information sur la source
Description
Bin voila, je pense que tout est dans le titre. C'est un petit programme qui scanne un repertoire et qui ecrit le contenu dans un fichier texte. On peut scanner un disque entier en demandant de scanner le repertoire 'C://' Chez moi, il met environs 30 secondes pour scanner les 110.000 fichiers de mon disque dur. Je ne sais pas pourquoi... la vitesse est tres tres variable. Je pense qu'il doit garder des informations en mémoire (des fois il met 2sc :) Ah oui, je l'ai fait avec Visual C++ 5, mais il doit pouvoir tourner assez facilement avec d'autres compilateurs je pense...
Source
- #include <windows.h>
- #include <stdio.h>
- #include <conio.h>
-
- void Save_En_Tete_Fichier(FILE* f, char *Chemin);
- void ScanContenuDossiers(char *CurrentDir, FILE* f);
-
- char Indentation[256] = ""; // sert à indenter dans le fichier texte
-
- int main()
- {
- FILE *f;
- char Dir_File[_MAX_PATH];
- char Chemin[_MAX_DIR];
-
- printf("\n\nTaper l'adresse du repertoire a scanner:\n\n");
- printf("par exemple : \"C://WINNT/\"");
- printf("\n\nChemin: ");
- gets(Chemin);
-
- printf("\n\nTaper le nom du fichier dans lequel sera enregistre les informations :\n\n");
- printf("\n\nChemin: ");
- gets(Dir_File);
-
- f = fopen(Dir_File,"wt");
- if (f == NULL)
- {
- printf("Erreur lors de l'ouverture du fichier");
- return 0;
- }
- else
- {
- Save_En_Tete_Fichier(f, Chemin);
-
- printf("Veuillez Patienter ...\n");
-
- ScanContenuDossiers(Chemin, f);
-
- fclose(f);
-
- printf("Operation reussie !\n");
- }
-
- return 0;
- }
-
- void Save_En_Tete_Fichier(FILE* f, char *Chemin)
- {
- ////////////////////////////////////////////////////////////////////////////////////////////////
- char *Texte;
-
- // on alloue de la memoire pour enregistrer deja les informations qui sont en en-tete du fichier
- Texte = (char*) malloc((90+strlen(Chemin))*sizeof(char)+1);
- // le +1 sert pour le '\0' à la fin de la chaine car strlen() ne le compte pas.
- // l'ensemble du texte ecrit en dessous fait 90 caracteres (zavez cas compter ;)
-
- // on copie l'en-tete dans Texte
- strcpy(Texte, "Repertoire en cours : ");
- strcat(Texte, Chemin);
- strcat(Texte, "\n");
- strcat(Texte, "--------------------------------------");
- strcat(Texte, "\n\n");
- strcat(Texte, "Fichiers présents : \n\n");
-
- // on enregistre les données dans notre fichier
- fwrite(Texte, sizeof(char), strlen(Texte), f);
-
- // on libère la mémoire
- free(Texte);
- ////////////////////////////////////////////////////////////////////////////////////////////////
- }
- void ScanContenuDossiers(char *CurrentDir, FILE *f)
- {
- /* ATTENTION, ICI IL FAUT EVITER D'UTILISER DES FONCTIONS COMME STRCPY OU STRCAT QUI RALLENTISSENT ENORMENENT" */
- /* ESSAYEZ DE RAJOUTER UN STRCPY DANS LA BOUCLE DO... LE TEMPS D'EXECUTION VA CONSIDERABLEMENT AUGMENTER */
-
- char Chemin[MAX_PATH];
- WIN32_FIND_DATA wData;
- HANDLE listing;
-
- // on rajoute *.* à la fin de l'adresse pour FindFirstFile()
- sprintf (Chemin, "%s*.*", CurrentDir);
- listing = FindFirstFile(Chemin, &wData);
-
- // on enleve le *.* à la fin de l'adresse
- sprintf (Chemin, "%s", CurrentDir);
-
- if (listing != INVALID_HANDLE_VALUE)
- {
- do
- {
- if ((strcmp(wData.cFileName, ".."))&&((strcmp(wData.cFileName, "."))))
- {
- if (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- {
- // puisque c'est un repertoire, on recupere la nouvelle adresse, et on va rentrer dedans...
- sprintf(Chemin, "%s%s/", CurrentDir, wData.cFileName);
- // avant, on stoque le nom du repertoire dans notre "fichier de listing" (fichier créé par notre programme)
- fprintf(f, "%s+ %s\n", Indentation,wData.cFileName);
- // on indente (car on va rentrer dans un repertoire)
- strcat(Indentation, " | ");
- // on rappelle la fonction pour qu'elle s'execute dans le repertoire (recurence)
- ScanContenuDossiers(Chemin, f);
- // on enleve l'indentation puisque on ressort du repertoire
- Indentation[strlen(Indentation)-4] = '\0';
-
- // reviens un repertoire en arrière
- int j = strlen(Chemin)-2;
- while (j>0)
- {
- if (Chemin[j] == '/')
- {
- Chemin[j+1] = '\0';
- break;
- }
- j--;
- }
- }
- else // si c'est pas un dossier, c'est un fichier...
-
- fprintf(f, "%s- %s\n", Indentation,wData.cFileName); // on enregistre le nom du fichier
-
- }
- }while (FindNextFile(listing, &wData));
- }
- FindClose(listing);
- }
#include <windows.h>
#include <stdio.h>
#include <conio.h>
void Save_En_Tete_Fichier(FILE* f, char *Chemin);
void ScanContenuDossiers(char *CurrentDir, FILE* f);
char Indentation[256] = ""; // sert à indenter dans le fichier texte
int main()
{
FILE *f;
char Dir_File[_MAX_PATH];
char Chemin[_MAX_DIR];
printf("\n\nTaper l'adresse du repertoire a scanner:\n\n");
printf("par exemple : \"C://WINNT/\"");
printf("\n\nChemin: ");
gets(Chemin);
printf("\n\nTaper le nom du fichier dans lequel sera enregistre les informations :\n\n");
printf("\n\nChemin: ");
gets(Dir_File);
f = fopen(Dir_File,"wt");
if (f == NULL)
{
printf("Erreur lors de l'ouverture du fichier");
return 0;
}
else
{
Save_En_Tete_Fichier(f, Chemin);
printf("Veuillez Patienter ...\n");
ScanContenuDossiers(Chemin, f);
fclose(f);
printf("Operation reussie !\n");
}
return 0;
}
void Save_En_Tete_Fichier(FILE* f, char *Chemin)
{
////////////////////////////////////////////////////////////////////////////////////////////////
char *Texte;
// on alloue de la memoire pour enregistrer deja les informations qui sont en en-tete du fichier
Texte = (char*) malloc((90+strlen(Chemin))*sizeof(char)+1);
// le +1 sert pour le '\0' à la fin de la chaine car strlen() ne le compte pas.
// l'ensemble du texte ecrit en dessous fait 90 caracteres (zavez cas compter ;)
// on copie l'en-tete dans Texte
strcpy(Texte, "Repertoire en cours : ");
strcat(Texte, Chemin);
strcat(Texte, "\n");
strcat(Texte, "--------------------------------------");
strcat(Texte, "\n\n");
strcat(Texte, "Fichiers présents : \n\n");
// on enregistre les données dans notre fichier
fwrite(Texte, sizeof(char), strlen(Texte), f);
// on libère la mémoire
free(Texte);
////////////////////////////////////////////////////////////////////////////////////////////////
}
void ScanContenuDossiers(char *CurrentDir, FILE *f)
{
/* ATTENTION, ICI IL FAUT EVITER D'UTILISER DES FONCTIONS COMME STRCPY OU STRCAT QUI RALLENTISSENT ENORMENENT" */
/* ESSAYEZ DE RAJOUTER UN STRCPY DANS LA BOUCLE DO... LE TEMPS D'EXECUTION VA CONSIDERABLEMENT AUGMENTER */
char Chemin[MAX_PATH];
WIN32_FIND_DATA wData;
HANDLE listing;
// on rajoute *.* à la fin de l'adresse pour FindFirstFile()
sprintf (Chemin, "%s*.*", CurrentDir);
listing = FindFirstFile(Chemin, &wData);
// on enleve le *.* à la fin de l'adresse
sprintf (Chemin, "%s", CurrentDir);
if (listing != INVALID_HANDLE_VALUE)
{
do
{
if ((strcmp(wData.cFileName, ".."))&&((strcmp(wData.cFileName, "."))))
{
if (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// puisque c'est un repertoire, on recupere la nouvelle adresse, et on va rentrer dedans...
sprintf(Chemin, "%s%s/", CurrentDir, wData.cFileName);
// avant, on stoque le nom du repertoire dans notre "fichier de listing" (fichier créé par notre programme)
fprintf(f, "%s+ %s\n", Indentation,wData.cFileName);
// on indente (car on va rentrer dans un repertoire)
strcat(Indentation, " | ");
// on rappelle la fonction pour qu'elle s'execute dans le repertoire (recurence)
ScanContenuDossiers(Chemin, f);
// on enleve l'indentation puisque on ressort du repertoire
Indentation[strlen(Indentation)-4] = '\0';
// reviens un repertoire en arrière
int j = strlen(Chemin)-2;
while (j>0)
{
if (Chemin[j] == '/')
{
Chemin[j+1] = '\0';
break;
}
j--;
}
}
else // si c'est pas un dossier, c'est un fichier...
fprintf(f, "%s- %s\n", Indentation,wData.cFileName); // on enregistre le nom du fichier
}
}while (FindNextFile(listing, &wData));
}
FindClose(listing);
}
Conclusion
Petit coucou à Jcdjcd qui a aussi fait un programme similaire mais qui ne l'a pas mis pour le moment sur le site.
remis à jour le 21 avril 2004 : - un tout petit peu plus rapide qu'avant... - avant je ne regardais pas ce que retournait FindFirstFile() <- ne renvoi pas tjours '.' ou '..' - racourci un peu le source (c'etait redondent à un endroit)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|