Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SCANDISC SIMPLE POUR LISTER LE CONTENU D'UN REPERTOIRE (+ DES SOUS-REPERTOIRES....)


Information sur la source

Catégorie :Fichiers / Disque Niveau : Débutant Date de création : 20/04/2004 Date de mise à jour : 21/04/2004 11:59:41 Vu / téléchargé: 6 779 / 576

Note :
10 / 10 - par 5 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Kirua le 21/04/2004 07:36:43

C'est très bon :-) Commenté à toutes les lignes, fonctionnel, utile, pftmnt indenté, c'est du beau travail pédagogique, merci ^^

signaler à un administrateur
Commentaire de Kornferki le 21/04/2004 10:58:12

Cool ce programme.

Serait il possible d obtenir egalement des attributs concernant les fichiers (taille, type, date de creation) et d ecrire tout cela dans un format tab separated (pour utilisation ulterieure dans Excel par exemple) ?

signaler à un administrateur
Commentaire de glipper le 21/04/2004 11:22:07


Ben, je vais voir ce que je peux faire :)
Et en + je viens de voir que je pouvais encore le simplifier un peu...
Glipper

signaler à un administrateur
Commentaire de glipper le 21/04/2004 17:56:05

Bon je laisse le code tel qu'il est, parceque tout le monde n'a surement pas besoin de faire un fichier pour le lire avec excel :)

Mais voila les changements à faire pour que ce soit au format tab separated (ça affiche la taille des fichiers en +)

---------------------------------------------------------

fprintf(f, "%s+ %s\n", Indentation,wData.cFileName);
--------- devient :
fprintf(f, "%s\\+ %s\n", Indentation,wData.cFileName);

---------------------------------------------------------

strcat(Indentation, " |  ");
--------- devient :
strcat(Indentation, "  | ");

---------------------------------------------------------

else
fprintf(f, "%s- %s\n", Indentation,wData.cFileName);
--------- devient :
else
{
DWORDLONG Taille = (wData.nFileSizeHigh &lt;&lt; 32);
Taille += (wData.nFileSizeLow & 0xFFFFFFFF);
fprintf(f, "%s%s\t\t\t\t\t\t\tTaille:\t%d\n", Indentation,wData.cFileName, Taille);
}

---------------------------------------------------------

Voila... il est peut-être possible d'afficher de même la taille des dossiers, je n'ai pas essayé.

Pour ce qui est des dates de création, même principe normalement... Ces infos sont stoqués aussi dans wData

typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;  // type
FILETIME ftCreationTime; // date de création
FILETIME ftLastAccessTime; // date du dernier acces
FILETIME ftLastWriteTime; // date de la derniere ecriture
...
} WIN32_FIND_DATA;

C'est expliqué + en détail dans msdn :)

++ Glipper

signaler à un administrateur
Commentaire de AzraelMonu le 30/04/2004 23:39:37

Alors la bravo, c super ton truc :)

Je vais apprendre plein de truc grace a toi! Merci :)

signaler à un administrateur
Commentaire de thesnakeplisken le 04/05/2004 18:06:36

Salut à tous. Bravo et merci il est super ce code. Je débute en c++ et je me suis permis de modifier ton code. J'ai remis les anti-slash car je compte utiliser ce source pour lancer des fichiers et je sais pas si tous les programmes apprécieront les slash et j'ai enlevé la fonction pour écrire dans le fichier (j'ai rédirigé vers la console) car je compte intégrer les résultats dans une liste virtuelle afin de leur faire subir un classement dès que j'aurai etoffé mes connaissances.

#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;

void ScanContenuDossiers(char *CurrentDir);

int main()
{
    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("Veuillez Patienter ...\n");
ScanContenuDossiers(Chemin);                
printf("Operation reussie !\n");

    return 0;
}

void ScanContenuDossiers(char *CurrentDir)
{
    /* 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);
                    // on rappelle la fonction pour qu'elle s'execute dans le repertoire (recurence)
                    ScanContenuDossiers(Chemin);                            
                    // reviens un repertoire en arrière
                    int j = strlen(Chemin)-2;
                    while (j&gt;0)
                    {
                        if (Chemin[j] == '\\')
                        {
                            Chemin[j+1] = '\0';
                            break;
                        }
                        j--;
                    }
                }
                else // si c'est pas un dossier, c'est un fichier...

                    printf("%s%s\n",Chemin,wData.cFileName); // on affiche le nom du fichier
            
            }
        }while (FindNextFile(listing, &wData));
    }
    FindClose(listing);
}

signaler à un administrateur
Commentaire de vinc1008881 le 06/01/2005 23:04:07

exelent tout simplement !

signaler à un administrateur
Commentaire de mikovitch1 le 24/04/2005 18:23:19

tres tres bon!
marche nikel
tres bien commenté!

signaler à un administrateur
Commentaire de bloom1 le 21/08/2006 04:30:10

Oui j'ai même modifié la source pour faire un dictionnaire de tous mes fichiers, et je vais probablement utiliser cette source pour faire un projet.
Merci !

signaler à un administrateur
Commentaire de informatique02 le 27/05/2008 23:58:23

mais comment le modifier pour qu'il marche en langage c sur linux???

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.