Se connecter / S'enregistrer
Votre question

[C++] Lister le contenu d'un dossier ?

Tags :
  • handle
  • Programmation
Dernière réponse : dans Programmation
Anonyme
9 Juin 2008 16:30:43

J'ai recuperé ce code sur internet :

  1. int main()
  2. {
  3. WIN32_FIND_DATA FindFileData;
  4. HANDLE hFind = INVALID_HANDLE_VALUE;
  5. char DirSpec[MAX_PATH]; // directory specification
  6.  
  7. cout<<"Path: ";
  8. cin.get(DirSpec, MAX_PATH);
  9. cout<<"\n";
  10. strncat(DirSpec, "\\*.*", 3);
  11. hFind = FindFirstFile(DirSpec, &FindFileData);
  12.  
  13. if(hFind == INVALID_HANDLE_VALUE)
  14. {
  15. cout<<"Error: invalid path\n";
  16. }
  17.  
  18. cout<<FindFileData.cFileName<<"\n";
  19.  
  20. while(FindNextFile(hFind, &FindFileData) != 0)
  21. {
  22. cout<<FindFileData.cFileName<<"\n";
  23. }
  24.  
  25. FindClose(hFind);
  26.  
  27. return 0;
  28. }


Mais a sa compilation dans VS 2008 il me reponds :
error C2664: 'FindFirstFileW' : impossible de convertir le paramètre 1 de 'char [260]' en 'LPCWSTR'.

Pourtant toutes les sources que je vois sur internet sont ecrites avec des char et ca a l'air de marcher pour eux ?!

Autres pages sur : lister contenu dossier

a b L Programmation
9 Juin 2008 21:38:27

LPCWSTR:
STR => chaine de caractères
LP => pointeur
LPC => pointeur constant (mais tout pointeur peut être implicitement convertit en pointeur constant, donc OK)
W => wide, c'est donc une chaine de caracètres dont les caractères sont codés sur 2 octets

Il te faut faire une conversion.
http://msdn.microsoft.com/en-us/library/ms776413.aspx
Anonyme
10 Juin 2008 11:09:22

Merci pour ton aide :) 

J'ai encore un probleme, j'ai remodlé le code comme ceci :
  1. int main()
  2. {
  3. WIN32_FIND_DATA FindFileData;
  4. HANDLE hFind = INVALID_HANDLE_VALUE;
  5. char DirSpec[MAX_PATH]; // directory specification
  6. LPWSTR Temp=0;
  7.  
  8. cout<<"Path: ";
  9. cin.get(DirSpec, MAX_PATH);
  10. cout<<"\n";
  11. strncat(DirSpec, "\\*.*", 3);
  12. Temp=L"";
  13. MultiByteToWideChar(CP_ACP,0,DirSpec,sizeof(DirSpec),Temp,2);
  14. hFind = FindFirstFile(Temp, &FindFileData);
  15.  
  16. if(hFind == INVALID_HANDLE_VALUE)
  17. {
  18. cout<<"Error: invalid path\n";
  19. }
  20.  
  21. cout<<FindFileData.cFileName<<"\n";
  22.  
  23. while(FindNextFile(hFind, &FindFileData) != 0)
  24. {
  25. cout<<FindFileData.cFileName<<"\n";
  26. }
  27.  
  28. FindClose(hFind);
  29.  
  30. return 0;
  31. }


Mais le compilo dit :
0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00417758 => qui correspond a Temp.

Hug ???
Contenus similaires
a b L Programmation
10 Juin 2008 19:02:05

  1. LPWSTR Temp=0;
pointeur null sur Temp
  1. Temp=L"";
Temp pointe sur une donnée temporaire "" de taille 2, à la ligne suivante, la donnée sera "désallouée".

Il faut que Temp soit alloué:
- soit par un tableau dimensionné WCHAR Temp[MAX_PATH*2]="";
- soit par allocation dynamique LPWSTR Temp=new WCHAR[MAX_PATH*2]

Ensuite tu donnes bien la taille dans la fonction (qui doit s'arrêter à la limite pour éviter tout buffer overflow).
Anonyme
10 Juin 2008 20:32:26

  1. int main()
  2. {
  3. WIN32_FIND_DATA FindFileData;
  4. HANDLE hFind = INVALID_HANDLE_VALUE;
  5. char DirSpec[MAX_PATH]; // directory specification
  6. LPWSTR Temp=new WCHAR[MAX_PATH*2];
  7.  
  8. cout<<"Path: ";
  9. cin.get(DirSpec, MAX_PATH);
  10. cout<<"\n";
  11. strncat(DirSpec, "\\*.*", 3);
  12. MultiByteToWideChar(CP_ACP,0,DirSpec,sizeof(DirSpec),Temp,2);
  13. cout<<&Temp;
  14. hFind = FindFirstFile(Temp, &FindFileData);
  15.  
  16. if(hFind == INVALID_HANDLE_VALUE)
  17. {
  18. cout<<"Error: invalid path\n";
  19. }
  20.  
  21. cout<<FindFileData.cFileName<<"\n";
  22.  
  23. while(FindNextFile(hFind, &FindFileData) != 0)
  24. {
  25. cout<<FindFileData.cFileName<<"\n";
  26. }
  27.  
  28. FindClose(hFind);
  29. system("pause");
  30. return 0;


ok ca compile, mais ca a pas l'aire de marcher ( erf ... dur dur le cpp, vive VB et la feantise ! )

Je rentre : c:\Windows. Et cela ne marche pas commeme ....

a b L Programmation
10 Juin 2008 21:00:13

qu'est-ce qui ne marche pas?
Anonyme
10 Juin 2008 21:01:03

Bah ca me liste pas le contenu du repertoire :'( 
a b L Programmation
11 Juin 2008 20:09:43

et ça affiche quoi?
Anonyme
12 Juin 2008 16:06:33

Citation :
Path: c:\windows

0012FBECError: invalid path
0012FD3C
Appuyez sur une touche pour continuer...
a b L Programmation
12 Juin 2008 19:38:10

Dans MultiByteToWideChar, tu indiques que la tailles de ton buffer est de 2 octets, donc il ne convertit qu'un seul caractère, d'où un chemin invalide.
donc remplace ton 2 par un sizeof(Temp) ou MAX_PATH*2.
Anonyme
12 Juin 2008 19:39:41

erf ....

Citation :
Path: c:\windows

0012FBEC0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
0012FD3C
Appuyez sur une touche pour continuer...


Je comprends pas pourquoi FindFileData.cFileName retourne son
adresse ....
a b L Programmation
12 Juin 2008 19:52:58

c'est surement parce que ça retourne un buffer de WCHAR (qui n'est autre qu'un unsigned short), donc le cout voit probablement ça comme un buffer de données.
Donc tu doit reconvertir en chaine ASCII. Du coup, tu va perdre tous les caractères étendus offerts par l'encodage sur 2 octets.
Anonyme
12 Juin 2008 20:01:25

re erf ....

Citation :
Path: c:\

00335FD80012FD30
MSOCache and Settings ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠MyVideos and Settings ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ntldr os and Settings ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Program Files Settin
gs ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
RECYCLER iles Settings ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠System Volume Information ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠WINDOWS olume Information ╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Appuyez sur une touc
he pour continuer...


  1. int main()
  2. {
  3.  
  4. int i=0;
  5. WIN32_FIND_DATA FindFileData;
  6. HANDLE hFind = INVALID_HANDLE_VALUE;
  7. char DirSpec[MAX_PATH]; // directory specification
  8. LPWSTR Temp=new WCHAR[MAX_PATH*2];
  9.  
  10. cout<<"Path: ";
  11. cin.get(DirSpec, MAX_PATH);
  12. cout<<"\n";
  13. strncat(DirSpec, "\\*.*", 3);
  14. MultiByteToWideChar(CP_ACP,0,DirSpec,sizeof(DirSpec),Temp,MAX_PATH*2);
  15. cout<<Temp;
  16. hFind = FindFirstFile(Temp, &FindFileData);
  17.  
  18. if(hFind == INVALID_HANDLE_VALUE)
  19. {
  20. cout<<"Error: invalid path\n";
  21. }
  22.  
  23. cout<<FindFileData.cFileName<<"\n";
  24.  
  25. while(FindNextFile(hFind, &FindFileData) != 0)
  26. {
  27. for (i = 0; i < 260; i++) {
  28. cout<<(char)FindFileData.cFileName[i];
  29. }
  30. }
  31.  
  32. FindClose(hFind);
  33. system("pause");
  34. return 0;
  35. }
Anonyme
12 Juin 2008 20:12:03

Desolé du double post, mais ca fait lourd dans un seul message :S

  1. int main()
  2. {
  3.  
  4. int i=0;
  5. WIN32_FIND_DATA FindFileData;
  6. HANDLE hFind = INVALID_HANDLE_VALUE;
  7. char DirSpec[MAX_PATH]; // directory specification
  8. LPWSTR Temp=new WCHAR[MAX_PATH*2];
  9. char antibuffer[2] = "0";
  10.  
  11. for(int i=0;i<261;i++)
  12. FindFileData.cFileName[i]=antibuffer[1];
  13.  
  14. cout<<"Path: ";
  15. cin.get(DirSpec, MAX_PATH);
  16. cout<<"\n";
  17. strncat(DirSpec, "\\*.*", 3);
  18. MultiByteToWideChar(CP_ACP,0,DirSpec,sizeof(DirSpec),Temp,MAX_PATH*2);
  19. hFind = FindFirstFile(Temp, &FindFileData);
  20.  
  21. if(hFind == INVALID_HANDLE_VALUE)
  22. {
  23. cout<<"Error: invalid path\n";
  24. }
  25.  
  26. for (i = 0; i < 261; i++) {
  27. cout<<(char)FindFileData.cFileName[i];
  28. }
  29. cout<<"\n";
  30. for(int i=0;i<261;i++)
  31. FindFileData.cFileName[i]=antibuffer[1];
  32.  
  33.  
  34. while(FindNextFile(hFind, &FindFileData) != 0)
  35. {
  36. for (i = 0; i < 261; i++) {
  37. cout<<(char)FindFileData.cFileName[i];
  38. }
  39. cout<<"\n";
  40. for(int i=0;i<261;i++)
  41. FindFileData.cFileName[i]=antibuffer[1];
  42. }
  43.  
  44. FindClose(hFind);
  45. system("pause");
  46. return 0;
  47. }


Citation :
Path: c:\

Documents and Settings


D
MSOCache



MyVideos



ntldr



Program Files


P
RECYCLER



System Volume Information


S
WINDOWS



Appuyez sur une touche pour continuer...


Reste plus qu'a comprendre d'ou sortent les dossiers : D , P et S :) 

Merci beaucoup pour ton aide !
12 Juin 2008 21:40:21

Je sais pas si ca peux aider mais:

Citation :
Path: c:\
Documents and Settings


D
MSOCache



MyVideos



ntldr



Program Files


P
RECYCLER



System Volume Information


S
WINDOWS


^^
a b L Programmation
13 Juin 2008 20:11:05

  1. for (i = 0; i < 261; i++) {
  2. cout<<(char)FindFileData.cFileName[i];
  3. }

C'est quoi ce truc ? :) 

Je ne sais pas si tu maitrise ce que tu as fait, qui normalement devrait générer un warning (de perte d'information).
tu convertis un nombre sur 2 octets en un nombre sur 1 octet. Comme les caractères ASCII ont une valeur inférieure à 255, ça marchera, mais si le caractère est réellement codé sur 2 octets, ça prend le modulo (reste de la division) de 256.
bref, toi tu affiche 261 caractères. Or ton répertoire ne fait pas autant de caractères, tu va donc lire au delà de ta chaine de caractère (tu dépasses le '\0' de fin de chaine), c'est pour ça que tu as n'importe quoi après. :) 

Si tu étais allé sur le lien MSDN que je t'avais donné, et que tu étais allé voir dans le "see also", tu aurais vu la fonction WideCharToMultiByte qui fait le travail inverse de MultiByteToWideChar. C'est donc cette fonction que tu dois utiliser.
http://msdn.microsoft.com/en-us/library/ms776420(VS.85).aspx
Anonyme
14 Juin 2008 12:00:00

Erf .... vive le VB merci pour tes conseils ;) 
Anonyme
3 Août 2008 21:54:29

Je déterre le topic car j'ai repris ce code ttaleur et j'ai remarqué qu'il ne listait pas les autres fichiers, mais que des dossiers ! Or il me faut qu'il liste aussi des fichiers da tout genre : exe,asp,htm etc ...

J'ai beau chercher, google me montre toujours ce bout de code pour faire ce que je veux ...

help ?
Anonyme
4 Août 2008 15:33:39

Ouais, super ca marche avec * ! Merci !
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS