2010-07-30 5 views
1

im en utilisant WIN32_FIND_DATA pour stocker les données findfirstfile sorties. Je veux l'emplacement du fichier (C: \ fichier) comme une chaîne, mais je ne sais pas comment l'obtenir ou d'autres données de celui-ci.comment convertir WIN32_FIND_DATA en chaîne?

Edit: voici mon code

PTSTR pszFileName; 
PTSTR pszFileName2[100]; 
if (search_handle) 
{ 
    do 
    { 
     pszFileName = file.cFileName; 
     pszFileName2[loop] = pszFileName; 
     Sleep(100); 
     loop++; 

     std::wcout << file.cFileName << std::endl; 
    } 
    while(FindNextFile(search_handle,&file)); 

    CloseHandle(search_handle); 
} 
+0

Quel matériau de référence utilisez-vous? S'il mentionne ce type de données mais ne décrit pas son contenu, alors nous devrions faire une note pour ne jamais recommander cette ressource à d'autres. Vous devriez envisager d'utiliser MSDN. –

Répondre

6

WIN32_FIND_DATA est un struct. Découvrez le membre cFileName.

Par exemple:

WIN32_FIND_DATA FindData = {0}; 
HANDLE hFind = FindFirstFile(pszPattern, &FindData); 

if (hFind != INVALID_HANDLE_VALUE) 
{ 
    do 
    { 
     PTSTR pszFileName = FindData.cFileName; 

     // TODO: Use pszFileName in some way... 

    } while (FindNextFile(hFind, &FindData)); 

    FindClose(hFind); 
} 

mise à jour en réponse aux commentaires

Dans cet exemple, le stockage de la chaîne est sur la pile, et le même tampon est utilisé pour chaque appel. Cela signifie que chaque FindNextFile() écrase la chaîne précédente. Vous devrez faire une copie de la chaîne.

Puisque vous utilisez C++ et classes std je vous suggère de le stocker dans std::string (ou mieux encore, assurez-vous de définir UNICODE et _UNICODE et utilisez wstring.) L'initialisation d'une nouvelle classe string fera l'allocation et la copie sur votre nom.

vous pouvez également copier la chaîne en utilisant les techniques classiques de C (par exemple: en utilisant malloc + memcpy, strdup, ou similaire), mais il semble que vous voudrez peut-être un rappel dans les chaînes, les pointeurs et l'allocation de mémoire en C avant vous arrivez à ça. Soit dit en passant - pour vérifier l'erreur, votre code compare la poignée de recherche contre NULL; Ceci est une erreur. FindFirstFile() renvoie INVALID_HANDLE_VALUE (ce qui correspond à (HANDLE)-1) en cas d'échec. En outre, pour fermer la poignée, vous devez utiliser FindClose() et non CloseHandle(). (Un "handle de recherche" n'est pas vraiment un handle pour un objet noyau dans le même sens qu'un handle de fichier, un handle vers un module, ou un thread ou un handle de processus est.Ils ont juste surchargé le type.)

+0

cela fonctionne bien mais seulement une fois je ne peux pas le mettre dans un tableau (regardez mon code). Je viens d'obtenir le même fichier, il va utiliser un tableau pour chaque fichier, mais ils ont tous le nom du dernier fichier – blood

+0

@blood - mise à jour de réponse passée sur vos commentaires. – asveikau

1

Le problème est que vous stockez l'adresse du nom de fichier dans votre tableau. Chaque fois que FindNextFile() est appelé, il remplace les données dans la structure par les informations pour le fichier suivant. Vous devez allouer de la mémoire pour la chaîne dans votre tableau, puis copiez la chaîne de la structure dans votre tableau (en utilisant quelque chose comme strncpy_s(), probablement).

Votre code stocke simplement le pointeur vers le nom de fichier membre de la structure, une fois par fichier trouvé. Si vous regardez l'adresse que chaque élément du tableau pointe vers, ils pointent tous vers le même endroit.

+0

o :(ok comment puis-je le copier, les données? – blood

+0

@blood C'est un très gros sujet, qui serait difficile à couvrir dans une réponse ici.Je vais echo @asveikau - vous devez vous rafraîchir avec la façon dont les pointeurs et les chaînes travailler en C/C++. – Andy