2010-07-29 6 views
12

J'ai besoin d'un moyen de rechercher des fichiers sur l'ordinateur tels que Windows Explorer. Je veux que mon programme de recherche disons disque dur c :. J'ai besoin de rechercher C: \ pour les dossiers et les fichiers (juste ceux que vous pourriez voir dans c: \ puis si l'utilisateur clique sur un fichier dans la liste comme le test de dossier (C: \ test) il chercherait test et laisserait l'utilisateur voir quels fichiers/dossiers sont dans cecomment rechercher des fichiers et des dossiers sur l'ordinateur

+0

Et votre question est ... quoi? –

+0

Il s'agit d'un problème spécifique à la plate-forme. Êtes-vous sur Windows, Unix, etc.? – TreDubZedd

+2

S'il se réfère à son disque dur comme 'C:' et les répertoires comme 'dossiers' il est assez évident que sa plate-forme pourrait être ... ;-) Oh, et le séparateur de chemin de barre oblique inverse le donne aussi. –

Répondre

14

Puisque vous avez mentionné les fenêtres, la façon la plus directe vers l'avant winapi de le faire est avec FindFirstFile et FindNextFile fonctions.

edit: Voici un exemple qui vous montre comment énumérer tous les fichiers/dossiers d'un répertoire. Boost :: filesystem peut être une solution multi-plate-forme pour cela (vérifier pour de telles fonctions dans celui-ci)

#include <Windows.h> 
#include <iostream> 


int main() 
{ 
    WIN32_FIND_DATA file; 
    HANDLE search_handle=FindFirstFile(L"C:\\*",&file); 
    if (search_handle) 
    { 
     do 
     { 
      std::wcout << file.cFileName << std::endl; 
     }while(FindNextFile(search_handle,&file)); 
     FindClose(search_handle); 

    } 

} 
+0

ce trouve uniquement les fichiers non? i need dossiers et fichiers. – blood

+0

Non, il trouve à la fois. il vous permet également de donner un critère de recherche pour trouver des fichiers/dossiers. – monoceres

+0

J'ai ajouté un exemple aussi bien – monoceres

2

vous pouvez utiliser Directory membres de la classe pour le faire avec C# ou C++ managée Voir l'article MSDN suivant:..

http://support.microsoft.com/kb/307009

Si vous souhaitez utiliser C + + avec MFC vous pouvez utiliser CFileFind

http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx

Vous devrez fournir votre propre fenêtre de navigation pour présenter l'arborescence du système de fichiers.

Ou vous pouvez utiliser l'un des contrôles de répertoire/fichier pour faire les deux pour vous.

+0

Qui utilise .Net et nécessite l'utilisation de C++/CLI. –

+0

@Georg: Merci pour la clarification. J'ai ajouté des informations supplémentaires au cas où il voudrait utiliser C++ sans .NET. –

+0

: | Je ne vois pas l'info – blood

4

Cela dépend du système d'exploitation. La question SO

How can I get a list of files in a directory using C or C++?

gère bien ce problème. Vous pouvez télécharger DIRENT ici. Maintenant que vous avez ceci, je vous recommande de rechercher récursivement un fichier avec un algorithme DFS/. Vous pouvez supposer que toute la structure du répertoire est tree où chaque fichier est un nœud feuille et chaque sous-répertoire est un nœud interne.

Donc, tout ce que vous avez à faire est,

  1. obtenir la liste des fichiers/dossiers dans un répertoire avec une fonction telle que:
    void getFilesFolders(vector<string> & dir_list, const string & folder_name)
  2. Si c'est un répertoire, allez à 1 avec le nom du répertoire
  3. S'il s'agit d'un fichier, terminez-le s'il s'agit du fichier que vous recherchez, sinon passez au fichier suivant.
+0

Comment puis-je obtenir une liste de fichiers dans un répertoire en utilisant C ou C++? c'est bien mais le code je n'arrive pas à travailler. seulement le code de Brian R. Bondy le dernier de son mais il trouve seulement des fichiers partie de ce que je voulais et aussi je ne peux pas trouver comment cela fonctionne donc je ne peux pas l'éditer pour mon programme :( – blood

+0

jouer avec dirent à voir si cela fonctionne vous revenir sur ce – blood

+0

uhh je ne peux pas le télécharger i dirent mais il décompresse un fichier et .9 c'est tout ce que j'ai raté quelque chose parce que je viens de télécharger à partir de votre lien – blood

2

+2

je ne voulais pas vraiment le logiciel 3ème partie – blood

+1

Pas vraiment 3ème partie logiciel tant, coup de pouce est pratiquement considéré comme la norme par les programmeurs C++, mais semble alors vous ne pas être celui qui aime utiliser des bibliothèques standard (autres que iostream, l'un des de C++ moins bonnes fonctionnalités). – CashCow

2
#include <Windows.h> 
#include <iostream> 


int FindF(char* pDirectory) 
{ 
    char szFindPath[MAX_PATH] = {0}; 
    strcpy(szFindPath, pDirectory); 
    strcat(szFindPath, "\\*"); 
    WIN32_FIND_DATA file; 
    HANDLE search_handle=FindFirstFile(szFindPath,&file); 
    if (search_handle) 
    { 
     do 
     { 
      if(file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) 
      { 
       strcpy(szFindPath, pDirectory); 
       strcat(szFindPath, "\\"); 
       strcat(szFindPath, file.cFileName); 
       FindF(szFindPath); 
      } 
      std::wcout << file.cFileName << std::endl; 
     }while(FindNextFile(search_handle,&file)); 
     CloseHandle(search_handle); 

    } 

} 
+0

C'est presque une bonne solution autre que: 1. C'est surtout en C que vous mettez en iostream donc vous écrivez en C avec iostream ... Si vous voulez écrire en C++ j'utiliserais au moins std :: string. Votre vraie gaffe sérieuse est que vous ne vérifiez pas pour les «points» de sorte que le vôtre se reproduira pour toujours (ou plus probablement souffrir du nom de ce site). – CashCow

+0

Utilisez FindClose() pour fermer le handle, ouvert avec FindFirstFile(). CloseHandle() lancera "handle invalide" en mode debug. – NoAngel

1

Il n'est vraiment pas nécessaire d'utiliser une bibliothèque tierce pour cela. C'est une fonction courte et indépendante qui répertorie tous les fichiers (avec leurs chemins) dans un répertoire, y compris les fichiers des sous-répertoires. std::string folderName doit terminer avec \, et si vous voulez lister tous les fichiers sur l'ordinateur, il suffit de créer une boucle dans la fonction d'appel avec GetLogicalDriveStrings (Il retourne des chaînes avec \, donc cela ne pourrait pas être plus pratique dans ce cas).

void FindAllFiles(std::string folderName) 
{ 
    WIN32_FIND_DATA FileData; 
    std::string folderNameWithSt = folderName + "*"; 
    HANDLE FirstFile = FindFirstFile(folderNameWithSt.c_str(), &FileData); 

    if (FirstFile != INVALID_HANDLE_VALUE) { 
     do { 
      if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0) 
      { 
       if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
       { 
        std::string NewPath = folderName + FileData.cFileName; 
        NewPath = NewPath + "\\"; 

        FindAllFiles(NewPath); 
       } 
       else 
       { 
        std::cout /*<< folderName*/ << FileData.cFileName << std::endl; 
       } 
      } 
     } while(FindNextFile(FirstFile, &FileData)); 
    } 
} 

Ceci est la version ASCII, rappelez-vous que les fichiers et les dossiers peuvent être nommés dans Unicode

+1

Je me demandais simplement, pourriez-vous expliquer quels sont les avantages par rapport à FindFile, s'il vous plaît? (et btw, ne devrait-il pas être ASCII ou ANSI?) –

Questions connexes