begin process at 2010 02 10 17:33:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > 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

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :7 093 / 586

Auteur : glipper

Ecrire un message privé
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip LIBRAIRIE POUR ÉVITER LES FUITES MEMOIRES
Source avec Zip Source avec une capture GETOPENFILENAME AVEC UNE TREEVIEW + CLIQUE DROIT
Source avec Zip COURS POINTEURS
REPROGRAMMER STRLEN ET STRCPY
FONCTIONS À TAILLE VARIABLE D'ARGUMENTS

 Sources de la même categorie

Source avec Zip Source avec une capture ID3 TAG COVER ALBUM IMAGE par nanonavich
FILEREADER par FrancoisGauthier
Source avec Zip CLASSE AVANCÉE DE LOG, THREAD SAFE ET DIVERSES SURCHARGES par sboli
Source avec Zip Source avec une capture Source .NET (Dotnet) INFILESEEKER par swonder
Source avec Zip Source avec une capture USB DETECTION par abandonware

Commentaires et avis

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 ^^

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) ?

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

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

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 :)

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);
}

Commentaire de vinc1008881 le 06/01/2005 23:04:07

exelent tout simplement !

Commentaire de mikovitch1 le 24/04/2005 18:23:19

tres tres bon!
marche nikel
tres bien commenté!

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 !

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales