[C++] Lister le contenu d'un dossier ?
Forum Programmation : [C++] Lister le contenu d'un dossier ?
J'ai recuperé ce code sur internet :
Code :
|
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 ?!
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
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Merci pour ton aide
J'ai encore un probleme, j'ai remodlé le code comme ceci :
Code :
|
Mais le compilo dit :
0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00417758 => qui correspond a Temp.
Hug ???
Répondre à Hrusdik
Code :
|
pointeur null sur Temp
Code :
|
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).
Message édité par CRicky le 10-06-2008 à 19:02:20
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Code :
|
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 ....
Répondre à Hrusdik
qu'est-ce qui ne marche pas?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Bah ca me liste pas le contenu du repertoire
Répondre à Hrusdik
et ça affiche quoi?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
| Citation : Path: c:\windows
|
Message édité par Hrusdik le 12-06-2008 à 16:07:04
Répondre à Hrusdik
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.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
erf ....
| Citation : Path: c:\windows
|
Je comprends pas pourquoi FindFileData.cFileName retourne son
adresse ....
Message édité par Hrusdik le 12-06-2008 à 19:42:36
Répondre à Hrusdik
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.
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
re erf ....
| Citation : Path: c:\
|
Code :
|
Répondre à Hrusdik
Desolé du double post, mais ca fait lourd dans un seul message :S
Code :
|
| Citation : Path: c:\
|
Reste plus qu'a comprendre d'ou sortent les dossiers : D , P et S
Merci beaucoup pour ton aide !
Message édité par Hrusdik le 12-06-2008 à 20:13:22
Répondre à Hrusdik
Je sais pas si ca peux aider mais:
| Citation : Path: c:\
|
^^
Code :
|
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/li [...] S.85).aspx
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Erf .... vive le VB merci pour tes conseils
Répondre à Hrusdik
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 ?
Répondre à Hrusdik
Normalement ça doit tout lister. Essaie en utilisant * au lieu de *.*
sur MSDN, il y a un exemple, donc je pense que ça devrait marcher.
http://msdn.microsoft.com/en-us/li [...] S.85).aspx
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Ouais, super ca marche avec * ! Merci !
Répondre à Hrusdik
Il y a 2416 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
