IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

connaitre le repertoire et se balader dedans


Sujet :

Windows

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut connaitre le repertoire et se balader dedans
    bonjour,

    je souhaite ouvrir le repertoire situé dans C:/Src et connaitre le nom de tout les fichiers jpg.

    j'utilise FindFirstFile et FindNextFile mais le problème c'est que ça me liste tous les fichiers qui sont dans le même repertoire que mon appli en c et c'est pas ce que je veux.

    comment fait on pour remonter et redescendre le repertoire ??

    j'utilise pas POSIX mais API windows

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu as SetCurrentDirectory(<new_dir>) pour changer de répertoire.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Tu peux montrer ton code ?
    L'itération est humaine; la récursion, divine.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    je suis encore à l'étape de recherche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    	const char folder[] = "C:\Src";
    	HANDLE hFile = NULL;
           WIN32_FIND_DATA ffInfo = {0};
    	SetCurrentDirectory(folder); 
    
    	hFile = FindFirstFile("*.*", &ffInfo);
    //	SetCurrentDirectory(folder); 
    	int size = strlen(folder);
    	for(short i=0;i<size;i++)
    		ffInfo.cFileName[i] = folder[i];
    bool re;
    
    do
    {
       /* Traitement */
       re = FindNextFile(hFile, &ffInfo);
    
    } while(re);
    
    FindClose(hFile);
    j'essaye des trucs mais SetCurrentDirectory(<new_dir>) ne marche pas, ou alors c'est que je sais pas m'en servir...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    j'ai regardé ce que j'obtiens, et je pense que si je peux connaitre l'adresse du dossier Src dans C: alors je peux affecter hFile à cette adresse et alors je parcourerais le bon répertoire. A supposer que je connaisse cette adresse, il va falloir que je sache aussi me "déplacer" de dossier en dossier

  6. #6
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char folder[] = "C:\\Src";
    SetCurrentDirectory doit être appelé avant FindFirstFile.

    Sinon, tu peux tout simplement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WIN32_FIND_DATA ffInfo;
    
    HANDLE hFile = FindFirstFile( "C:\\Src\\*.jpg", &ffInfo );
    
    if ( hFile != INVALID_HANDLE_VALUE )
    {
        do
        {
            printf( "JPG -> %s\n", ffInfo.cFileName );
    		
        } while( FindNextFile( hFile, &ffInfo ) );
    	
        FindClose( hFile );
    }
    L'itération est humaine; la récursion, divine.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    arrgg tu m'as doublé Mayti4
    j'avais trouvé hFile = FindFirstFile("C:\\Src\\*", &ffInfo);
    _______________________________________________________________

    je pars du boulot, mais demain je mettrais ce que j'ai fait

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    voici ce que j'ai fait:

    on passe en argument le nom du repertoire et le nom des fichiers que l'on veut récupérer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    #include "fichier.h"
    
    //receive:	1) the name of the directory
    //			2) The root name of the picture
    //for example	argv[0] is "C:\Src\"
    //				argv[1] id "frame"
    // the function browses into C:\Src\ and return all the files whose name is beggining by "frame"
     
    void fichiers (int argc, char **argv)
    {
    	if(argc == 2)
    	{
    		//reading argument
    		char temp_dir[100];
    		char temp_file[100];
    		strcpy(temp_dir, argv[0]);
    		strcpy(temp_file, argv[1]);
    		short file_len = strlen(argv[1]);
    		short dir_len = strlen(argv[0]);
    		short Aslash_nb = 0;
    
    		// ASCII '\' => 47
    		for(short i=0;i<dir_len;i++)
    			if(temp_dir[i] == 47)
    				Aslash_nb++;
    
    		char *folder = new char[dir_len+Aslash_nb];// = "C:\\Src\\*";
    		char *folder2 = new char[dir_len+Aslash_nb+1];// = "C:\\Src\\";
    
    		short j = 0;
    		for(i=0;i<dir_len;i++)
    		{
    			if(temp_dir[i] == 47)
    			{
    				folder[j] = temp_dir[i];
    				folder2[j++] = temp_dir[i];
    				folder[j] = 47;
    				folder2[j++] = 47;
    			}
    			else
    			{	
    				folder[j] = temp_dir[i];
    				folder2[j++] = temp_dir[i];
    			}
    		}
    		sprintf(folder2, "%c", "*");
    		
    		
    		
    		char root[] = "..";
    		HANDLE hFile = NULL;
    		HANDLE *qq;
    		   WIN32_FIND_DATA ffInfo = {0};
    
    		hFile = FindFirstFile(folder, &ffInfo);
    		if(hFile == INVALID_HANDLE_VALUE)
    		{
    			exit(1);
    		}
    		
    
    		short re;
    		char current_folder[260];
    
    		do
    		{
    		   // Traitement 
    		   re = FindNextFile(hFile, &ffInfo);
    			if(strcmp(current_folder,ffInfo.cFileName) != 0)	
    			{
    				if(ffInfo.dwFileAttributes == 16)
    				{
    					// folder found
    					char nom[260];
    
    					strcpy(nom, ffInfo.cFileName);
    					if(*nom != *root)
    					{
    						char chemin[260];
    						sprintf(chemin, "%s%s%s", folder2, nom, "\\*");
    						
    						printf("%s\n", chemin);
    
    						// close handle
    						FindClose(hFile);
    
    						// store the folder adress
    						HANDLE *qq = new HANDLE[1];
    						//enter in the folder
    						qq[0] = FindFirstFile(chemin, &ffInfo);
    						
    
    						do{
    							re = FindNextFile(qq[0], &ffInfo);
    							if(ffInfo.dwFileAttributes == 32)
    							{
    								if(file_len == strspn(temp_file, ffInfo.cFileName))
    								{
    									//ici on envoit le nom des fichiers
    									//
    									printf("%s\n", ffInfo.cFileName);
    								}
    							}
    						}while(re);
    					re = true;
    
    					//end of the folder
    					FindClose(qq[0]);
    					HANDLE hFile = NULL;
    					hFile = FindFirstFile(folder, &ffInfo);
    					delete[]qq;
    
    					do{
    						re = FindNextFile(hFile, &ffInfo);
    						if(ffInfo.dwFileAttributes == 16)
    							strcpy(current_folder, ffInfo.cFileName);
    						}while((strcmp(current_folder,nom) != 0) && (re == 1));
    
    					}
    
    				}
    			}
    			else
    				re = 0;
    
    		} while(re);
    
    		FindClose(hFile);
    
    	}
    	else
    	{
    		printf("Not enought argument in function File\n");
    	}
    
    }
    _________________________________________________________________

    On considère que l'on a qu'une arborescence pour en faire plusieurs je pense qu'il faut passer par des listes chainées...

    j'avais pas le courage

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Pour mémoriser les noms de fichiers, tu as intérêt à utilisé MAX_PATH sous Windows, mais peut-être est-ce uniquement MicroSoft ?
    D'autre part, pourquoi short i ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    ok j esavais pas pour MAX_PATH je vais faire la modification.

    j'ai choisit un short car je pense que c'est suffisant, j'aurais pu prendre un int, mais je pense pas que ça change grand chose

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ca n'est intéressant que pour un gain de place dans de gros fichiers ou tableaux, mais là ça fait, je crois, plus perdre du temps machine qu'autre chose pour les conversions.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    il y a des petites erreurs dans ce que j'ai fait:
    / ASCII => 92


    char *folder2 = new char[dir_len+Aslash_nb+1]; =>
    char *folder2 = new char[dir_len+Aslash_nb-1];

    sprintf(folder2, "%c", "*"); devient folder[j] = '*';

    Mais il y a encore un truc bizarre, j'initialise folder et folder2 à la bonne taille mais lorque je vais voir en mode débuggage, il y a plein de caractère bizarre après dir_len+Aslash_nb ??? peut être il existe un moyen de dire que c'est la fin du mot ?

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Peut-être qu'en rajoutant le 0 de fin de chaîne au bon endroit...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    ce que je fait en fin de chaîne c'est folder2[j] = '\0'; mais après lorsque on a l'instruction:
    sprintf(chemin, "%s%s%s", folder2, nom, "\\*");

    le mot chemin fait: C:\Src\²...\*
    avec ... qui correspond à ce qui est dans nom. bref le programme rajoute un ² qui fait tout bugger

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Ok c'est bon j'allais taper une case plus loin dans folder2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Comment connaitre le répertoire courant d'exécution ?
    Par romstarr dans le forum Services Web
    Réponses: 4
    Dernier message: 30/08/2009, 17h37
  2. Réponses: 5
    Dernier message: 17/03/2006, 12h36
  3. connaitre les repertoires
    Par jmjmjm dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 25/02/2006, 18h07
  4. Connaitre le repertoire courant
    Par vincent0 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 14/02/2005, 19h53
  5. [Système] Connaître le répertoire courant
    Par Kimael dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 15/07/2004, 17h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo