Comment faire pour dossiers de recherche de manière récursive à l'aide de Visual C++

Traductions disponibles Traductions disponibles
Numéro d'article: 307009 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape décrit comment à de manière récursive les sous-dossiers de recherche des fichiers, commençant par un dossier racine, à l'aide de code. Cette tâche est appelée récursivité d'annuaire. Vous pouvez spécifier une chaîne de recherche afin que vous pouvez rechercher des fichiers qui correspondent à un certains critères. Chaque partie du code dans cet article est expliqué, et un exemple de code travail est également fourni.

Récursivité de répertoire est une tâche d'E / S courants pour les développeurs. L'objet FileSystemObject facilite cette tâche de composant (Object Model) programmes, mais cette tâche est plus facile dans Visual C++ .NET 2002. Semblable à l'objet FileSystemObject , les classes dans l'espace de noms System.IO constituent un moyen orientée objet d'accéder aux fichiers et dossiers.

Configuration requise

La liste suivante met en évidence le matériel recommandé, logiciel infrastructure réseau et service packs dont vous avez besoin :
  • Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005

Activer la récursivité d'annuaire

Les classes de manipulation de fichiers et de répertoires se trouvent dans l'espace de noms System::IO . Avant de manipuler ces classes, ajoutez le code suivant :
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
l'espace System::IO permet plusieurs options pour travailler avec des fichiers et dossiers. L'espace de noms System::IO fournit non seulement des classes que vous pouvez créer une instance de, mais il offre également fichier et répertoire classes d'utilitaire. Ces classes contiennent des méthodes statiques que vous pouvez appeler sans avoir à déclarer une variable de ce type. Par exemple, vous pouvez utiliser la classe Directory pour obtenir les sous-dossiers d'un dossier.

Le code suivant utilise la méthode GetDirectories statique de la classe d'annuaire pour renvoyer une matrice de chaînes. Ce tableau contient chemins d'accès dossier aux sous-dossiers du dossier C:\, le cas échéant :
String* directories[] = Directory::GetDirectories("C:\\");
				
la classe Directory contient également la méthode GetFiles . Vous pouvez utiliser GetFiles pour extraire un tableau de chaîne de fichiers qui correspondent à un certains critères. L'exemple de code suivant utilise la méthode GetFiles pour récupérer les tous les fichiers dans le dossier C:\ avec une extension de nom de fichier .DLL :
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
vous pouvez utiliser la méthode GetDirectories et la méthode GetFiles de la classe Directory pour rechercher de manière récursive les fichiers qui correspondent à la chaîne de recherche. Utilisez la méthode suivante pour effectuer la récursivité :
	 void DirSearch(String* sDir)
	 {
		 try
		 {
			 // Find the subfolders in the folder that is passed in.
			 String* d[] = Directory::GetDirectories(sDir);
			 int numDirs = d->get_Length();
			 
			 for (int i=0; i < numDirs; i++)
			 {
				 // Find all the files in the subfolder.
				 String* f[] = Directory::GetFiles(d[i],textBox1->Text);
				 int numFiles = f->get_Length();

				 for (int j=0; j < numFiles; j++)
				 {
					 listBox1->Items->Add(f[j]);
				 }
				 DirSearch(d[i]);
			 }
		 }
		 catch (System::Exception* e)
		 {
			 MessageBox::Show(e->Message);
		 }
	 }
le code précédent transmet une chaîne à la fonction DirSearch . Cette valeur de chaîne est le chemin complet du dossier que vous voulez rechercher. Vous pouvez utiliser la méthode GetDirectories pour extraire les sous-dossiers du dossier qui est transmis dans votre procédure. Dans la mesure où la méthode GetDirectories renvoie une matrice, vous pouvez utiliser une instruction for pour effectuer une itération sur chaque sous-dossier. Pour chaque sous-dossier, utilisez la méthode GetFiles pour effectuer une itération sur les fichiers dans ce dossier. La valeur de la zone de texte de votre formulaire est transmise à la méthode GetFiles . La zone de texte contient la chaîne de recherche qui filtre les résultats que la méthode GetFiles renvoie. Lorsque le fichier correspondent aux critères de recherche, celui-ci est ajouté à votre zone de liste. Pour chaque sous-dossier qui se trouve, appelez la fonction DirSearch à nouveau et puis transmettre un sous-dossier. Vous pouvez utiliser cet appel récursif pour rechercher tous les sous-dossiers d'un dossier racine que vous spécifiez.

Créer l'exemple

  1. Démarrez Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005.
  2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
  3. Sous types de projets , cliquez sur Visual C++ .NET .

    note Dans Microsoft Visual C++ 2005, Visual C++ .NET est modifié pour Visual C++ .
  4. Sous modèles , cliquez sur Windows Forms applications (.NET) .
  5. Dans la zone Nom , tapez RecursiveSearchCPP . Dans la rechercher zone, tapez C:\ et puis cliquez sur OK .
  6. Ouvrez le formulaire Form1 en création afficher et appuyez sur F4 pour ouvrir la fenêtre Propriétés.
  7. Dans la fenêtre Propriétés, développez le dossier taille . Dans le champ largeur , tapez 700 . Dans le champ hauteur , tapez 320 .
  8. Ajouter deux contrôles étiquette , un contrôle zone de texte , un contrôle de zone de liste déroulante , un contrôle de zone de liste et un contrôle de bouton au formulaire Form1.
  9. Dans la fenêtre Propriétés, modifiez comme suit l' emplacement , la taille , la propriété TabIndex et les propriétés de texte :
    Réduire ce tableauAgrandir ce tableau
    Contrôle de codeEmplacementTailleTabIndexTexte
    Label18, 16144, 165Rechercher les fichiers qui contiennent :
    zone de texte 18, 40120, 204*.dll
    label28, 96120, 253Regarder dans :
    Button1608, 24875, 250& Rechercher
    Zoneliste1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. Dans la méthode InitializeComponent de la zone de liste modifiable, ajoutez le code suivant pour inscrire tous les lecteurs réseau qui sont disponibles sur l'ordinateur :
    // Enlist all the network drives that are available on the computer.
    String* p_logicalDrives[] = __gc new String*[];
    comboBox1->Items->Clear();
    p_logicalDrives = Directory::GetLogicalDrives();
    int numDrives = p_logicalDrives->get_Length();
    
    for (int i=0; i< numDrives; i++)
    {
    	comboBox1->Items->Add(p_logicalDrives[i]);
    }
  11. Double-cliquez sur le bouton Rechercher et collez le code suivant dans la méthode :
    // Clear the list box.
    listBox1->Items->Clear();
    // You do not have the option to change the values of the files to be searched
    // until the search is completed. Therefore, the following value is false.
    textBox1->Enabled = false;
    comboBox1->Enabled = false;
    
    button1->Text = S"Searching...";
    this->Cursor = Cursors::WaitCursor;
    Application::DoEvents();
    
    // Callthe recursive search method.
    DirSearch(comboBox1->Text);
    button1->Text = S"Search";
    this->Cursor = Cursors::Default;
    
    // After the search is completed, the search criteria is enabled 
    //and you can add other search criteria to search the files recursively.
    textBox1->Enabled = true;
    comboBox1->Enabled = true;
    
  12. Pour créer l'application, appuyez sur CTRL + F5 pour générer.
  13. Exécutez l'application.

Exécuter les exemples de code

// Form1.h
#pragma once

namespace RecursiveSearchCPP
{
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::IO;

	/// <summary> 
	/// Summary for Form1
	///
	/// WARNING: If you change the name of this class, you must change the 
	///          Resource File Name property for the managed resource compiler tool 
	///          that is associated with all .resx files that this class depends on.  Otherwise,
	///          the designers will not be able to interact correctly with localized
	///          resources that are associated with this form.
	/// </summary>
	public __gc class Form1 : public System::Windows::Forms::Form
	{	
	public:
		Form1(void)
		{
			InitializeComponent();
		}
  
	protected:
		void Dispose(Boolean disposing)
		{
			// Form::Dispose(Disposing);
			if (disposing && components)
			{
				components->Dispose();
			}
			__super::Dispose(disposing);
		}
	private: System::Windows::Forms::Label *  label1;
	private: System::Windows::Forms::TextBox *  textBox1;
	private: System::Windows::Forms::Label *  label2;
	private: System::Windows::Forms::Button *  button1;
	private: System::Windows::Forms::ListBox *  listBox1;
	private: System::Windows::Forms::ComboBox *  comboBox1;

	private:
		/// <summary>
		/// This is the required designer variable.
		/// </summary>
		System::ComponentModel::Container * components;

		/// <summary>
		/// This is the required method for Designer support. Do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->label1 = new System::Windows::Forms::Label();
			this->textBox1 = new System::Windows::Forms::TextBox();
			this->label2 = new System::Windows::Forms::Label();
			this->button1 = new System::Windows::Forms::Button();
			this->listBox1 = new System::Windows::Forms::ListBox();
			this->comboBox1 = new System::Windows::Forms::ComboBox();
			this->SuspendLayout();
			// 
			// label1
			// 
			this->label1->Location = System::Drawing::Point(8, 16);
			this->label1->Name = S"label1";
			this->label1->Size = System::Drawing::Size(144, 16);
			this->label1->TabIndex = 5;
			this->label1->Text = S"Search for files containing:";
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(8, 40);
			this->textBox1->Name = S"textBox1";
			this->textBox1->Size = System::Drawing::Size(120, 20);
			this->textBox1->TabIndex = 4;
			this->textBox1->Text = S"*.dll";
			// 
			// label2
			// 
			this->label2->Location = System::Drawing::Point(8, 96);
			this->label2->Name = S"label2";
			this->label2->Size = System::Drawing::Size(120, 23);
			this->label2->TabIndex = 3;
			this->label2->Text = S"Look in:";
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(608, 248);
			this->button1->Name = S"button1";
			this->button1->TabIndex = 0;
			this->button1->Text = S"&Search";
			this->button1->Click += new System::EventHandler(this, button1_Click);
			// 
			// listBox1
			// 
			this->listBox1->Location = System::Drawing::Point(152, 8);
			this->listBox1->Name = S"listBox1";
			this->listBox1->Size = System::Drawing::Size(530, 225);
			this->listBox1->TabIndex = 1;
			// 
			// comboBox1
			//
			// Enlist all the network drives that are available on the computer.
			//
			String* p_logicalDrives[] = __gc new String*[];
			comboBox1->Items->Clear();
			p_logicalDrives = Directory::GetLogicalDrives();
	        int numDrives = p_logicalDrives->get_Length();
			for (int i=0; i< numDrives; i++)
			{
				comboBox1->Items->Add(p_logicalDrives[i]);
			}
			this->comboBox1->Location = System::Drawing::Point(8, 128);
			this->comboBox1->Name = S"comboBox1";
			this->comboBox1->Size = System::Drawing::Size(120, 25);
			this->comboBox1->TabIndex = 2;
			this->comboBox1->Text = S"C:\\";

			// 
			// Form1
			// 
			this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
			this->ClientSize = System::Drawing::Size(688, 286);
			this->Controls->Add(this->comboBox1);
			this->Controls->Add(this->listBox1);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->label2);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->label1);
			this->Name = S"Form1";
			this->Text = S"Form1";
			this->ResumeLayout(false);

		}

	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
	 {
  		//Clears the list box		
  		listBox1->Items->Clear();
  		// You do not have option to change the values of the files to be searched
  		// until the search is completed. Therefore, the value of the following is false.
 	 	textBox1->Enabled = false;
  		comboBox1->Enabled = false;

 	 	button1->Text = S"Searching...";
 		 this->Cursor = Cursors::WaitCursor;
  		Application::DoEvents();

  		// Call the recursive search method.
  		DirSearch(comboBox1->Text);
  		button1->Text = S"Search";
  		this->Cursor = Cursors::Default;
  
  		// After the search is completed, the search criteria is enabled 
  		// and you can add other search criteria to search the files recursively.
  		textBox1->Enabled = true;
  		comboBox1->Enabled = true;
	 }

	 void DirSearch(String* sDir)
	 {
		 try
		 {
			 // Find the subfolders in the folder that is passed in.
			 String* d[] = Directory::GetDirectories(sDir);
			 int numDirs = d->get_Length();
			 
			 for (int i=0; i < numDirs; i++)
			 {
				 // Find all the files in the subfolder.
				 String* f[] = Directory::GetFiles(d[i],textBox1->Text);
				 int numFiles = f->get_Length();

				 for (int j=0; j < numFiles; j++)
				 {
					 listBox1->Items->Add(f[j]);
				 }
				 DirSearch(d[i]);
			 }
		 }
		 catch (System::Exception* e)
		 {
			 System::Console::WriteLine(e->Message);
		 }
	 }
};
}

//Form1.cpp
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>

using namespace RecursiveSearchCPP;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
	Application::Run(new Form1());
	return 0;
}

Références

Pour plus d'informations sur la création Windows Forms dans les extensions gérées pour Visual C++ .NET 2002, consultez l'exemple « ManagedCWinFormWiz » dans Aide de Visual Studio .NET.

Propriétés

Numéro d'article: 307009 - Dernière mise à jour: mardi 28 août 2007 - Version: 3.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Initiation
Mots-clés : 
kbmt kbhowtomaster kbio KB307009 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 307009
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com