COMMENT FAIRE : Recherche récursive de répertoires à l'aide de Visual C#

Traductions disponibles Traductions disponibles
Numéro d'article: 303974 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F303974
Pour vous procurer une version Microsoft Visual C++ .NET de cet article, reportez-vous à l'article : 307009.
Pour vous procurer une version Microsoft Visual Basic .NET de cet article, reportez-vous à l'article : 306666.

Cet article se rapporte à l'espace de noms de la bibliothèque de classes Microsoft .NET Framework suivant :
  • System.IO
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article de procédure pas à pas explique comment rechercher des fichiers dans des sous-répertoires de manière récursive dans une application C# Windows Forms. Une chaîne de recherche est spécifiée afin de vous permettre de rechercher des fichiers correspondant à certains critères de caractère générique. Les parties du code sont expliquées en fonction des besoins. Un exemple de code opérationnel est également fourni à la fin de cet article.

La récursivité de répertoire est une tâche d'E/S courante pour les développeurs. FileSystemObject simplifie cette tâche pour les applications COM (Component Object Model). Cette tâche est devenue encore plus simple dans .NET. Comme pour FileSystemObject, les classes de l'espace de noms System.IO fournissent une méthode orientée objet pour accéder aux fichiers et aux répertoires.

Conditions requises

  • Microsoft Visual C# 2005 ou Microsoft Visual C# .NET

Récursivité de répertoire

Les classes de manipulation de fichiers et de répertoires se trouvent dans l'espace de noms System.IO. Avant d'utiliser ces classes, importez l'espace de noms suivant dans votre projet :
using System.IO;
Les classes de l'espace de noms System.IO fournissent de nombreuses classes pour travailler avec les fichiers et les répertoires. Ces classes contiennent des classes de fichiers, de répertoires, et d'utilitaires. Plusieurs de ces classes contiennent des méthodes statiques que vous pouvez appeler sans devoir déclarer de variable de ce type. Par exemple, vous pouvez utiliser l'objet Directory pour obtenir les sous-répertoires d'un répertoire donné.

Le code suivant utilise la méthode GetDirectories statique de l'objet Directory pour retourner un tableau de chaînes. Ce tableau de chaînes contient les noms des chemins des sous-répertoires du répertoire C:\, s'ils existent.
string[] directories = Directory.GetDirectories("C:\\");
L'objet Directory contient également une méthode appelée GetFiles, qui vous permet de récupérer un tableau de chaînes de fichiers correspondant à certains critères. L'exemple de code suivant utilise l'objet File pour récupérer tous les fichiers du répertoire C:\ ayant une extension .dll :
string[] files = Directory.GetFiles("C:\\", "*.dll");
Les méthodes GetDirectories et GetFiles de l'objet Directory suffisent pour effectuer des recherches récursives de fichiers correspondant à la chaîne de recherche. La méthode suivante sert à réaliser la récursivité :
void DirSearch(string sDir) 
{
	try	
	{
	   foreach (string d in Directory.GetDirectories(sDir)) 
	   {
		foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
		{
		   lstFilesFound.Items.Add(f);
		}
		DirSearch(d);
	   }
	}
	catch (System.Exception excpt) 
	{
		Console.WriteLine(excpt.Message);
	}
}
Le code précédent transmet une chaîne contenant le répertoire de recherche à DirSearch. La valeur de cette chaîne est le chemin d'accès complet au répertoire. Vous pouvez utiliser GetDirectories pour récupérer les sous-répertoires du répertoire passé dans la procédure. Étant donné que GetDirectories retourne un tableau, vous pouvez utiliser une syntaxe For Each à répéter sur chaque sous-répertoire. Pour chaque sous-répertoire, utilisez la méthode GetFiles pour répéter la syntaxe sur les fichiers de ce répertoire. La valeur de la zone de texte de votre formulaire est transmise à GetFiles. La zone de texte contient la chaîne de recherche qui filtre les résultats renvoyés par GetFiles. Si des fichiers correspondent aux critères de recherche, ils sont ajoutés à votre zone de liste. Pour chaque sous-répertoire localisé, appelez de nouveau DirSearch et transmettez-lui un nom de sous-répertoire. Grâce à cet appel récursif, vous pouvez effectuer des recherches dans tous les sous-répertoires d'un répertoire racine donné.

Exemple de code complet

  1. Démarrez un nouveau projet d'application Windows Visual C#. Par défaut, un formulaire nommé Form1 est créé.
  2. Dans le menu Affichage, cliquez pour afficher l'Explorateur de solutions.
  3. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Form1, puis cliquez sur Afficher le code.
  4. Dans la fenêtre de code Form1, mettez le code existant en surbrillance et supprimez-le.
  5. Copiez le code suivant dans la fenêtre de code de Form1.
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;
    
    namespace RecursiveSearchCS
    {
        /// <summary>
        /// Summary description for Form1
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
            internal System.Windows.Forms.Button btnSearch;
            internal System.Windows.Forms.TextBox txtFile;
            internal System.Windows.Forms.Label lblFile;
            internal System.Windows.Forms.Label lblDirectory;
            internal System.Windows.Forms.ListBox lstFilesFound;
            internal System.Windows.Forms.ComboBox cboDirectory;
            /// <summary>
            /// Required designer variable
            /// </summary>
            private System.ComponentModel.Container components = null;
    
            public Form1()
            {
                // 
                // Required for Windows Form Designer support
                // 
                InitializeComponent();
    
                // 
                // TODO: Add any constructor code after InitializeComponent call.
                // 
            }
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                if( disposing )
                {
                    if (components != null) 
                    {
                        components.Dispose();
                    }
                }
                base.Dispose( disposing );
            }
    
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support: do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.btnSearch = new System.Windows.Forms.Button();
                this.txtFile = new System.Windows.Forms.TextBox();
                this.lblFile = new System.Windows.Forms.Label();
                this.lblDirectory = new System.Windows.Forms.Label();
                this.lstFilesFound = new System.Windows.Forms.ListBox();
                this.cboDirectory = new System.Windows.Forms.ComboBox();
                this.SuspendLayout();
                // 
                // btnSearch
                // 
                this.btnSearch.Location = new System.Drawing.Point(608, 248);
                this.btnSearch.Name = "btnSearch";
                this.btnSearch.TabIndex = 0;
                this.btnSearch.Text = "Search";
                this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
                // 
                // txtFile
                // 
                this.txtFile.Location = new System.Drawing.Point(8, 40);
                this.txtFile.Name = "txtFile";
                this.txtFile.Size = new System.Drawing.Size(120, 20);
                this.txtFile.TabIndex = 4;
                this.txtFile.Text = "*.dll";
                // 
                // lblFile
                // 
                this.lblFile.Location = new System.Drawing.Point(8, 16);
                this.lblFile.Name = "lblFile";
                this.lblFile.Size = new System.Drawing.Size(144, 16);
                this.lblFile.TabIndex = 5;
                this.lblFile.Text = "Search for files containing:";
                // 
                // lblDirectory
                // 
                this.lblDirectory.Location = new System.Drawing.Point(8, 96);
                this.lblDirectory.Name = "lblDirectory";
                this.lblDirectory.Size = new System.Drawing.Size(120, 23);
                this.lblDirectory.TabIndex = 3;
                this.lblDirectory.Text = "Look In:";
                // 
                // lstFilesFound
                // 
                this.lstFilesFound.Location = new System.Drawing.Point(152, 8);
                this.lstFilesFound.Name = "lstFilesFound";
                this.lstFilesFound.Size = new System.Drawing.Size(528, 225);
                this.lstFilesFound.TabIndex = 1;
                // 
                // cboDirectory
                // 
                this.cboDirectory.DropDownWidth = 112;
                this.cboDirectory.Location = new System.Drawing.Point(8, 128);
                this.cboDirectory.Name = "cboDirectory";
                this.cboDirectory.Size = new System.Drawing.Size(120, 21);
                this.cboDirectory.TabIndex = 2;
                this.cboDirectory.Text = "ComboBox1";
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                this.ClientSize = new System.Drawing.Size(688, 277);
                this.Controls.AddRange(new System.Windows.Forms.Control[] {
    
                this.btnSearch,
                this.txtFile,
                this.lblFile,
                this.lblDirectory,
                this.lstFilesFound,
                this.cboDirectory});
    
                this.Name = "Form1";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
                this.ResumeLayout(false);
    
            }
            #endregion
    
            /// <summary>
            /// The main entry point for the application
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run(new Form1());
            }
    
            private void btnSearch_Click(object sender, System.EventArgs e)
            {
                lstFilesFound.Items.Clear();
                txtFile.Enabled = false;
                cboDirectory.Enabled = false;
                btnSearch.Text = "Searching...";
                this.Cursor = Cursors.WaitCursor;
                Application.DoEvents();
                DirSearch(cboDirectory.Text);
                btnSearch.Text = "Search";
                this.Cursor = Cursors.Default;
                txtFile.Enabled = true;
                cboDirectory.Enabled = true;
            }
    
            private void Form1_Load(object sender, System.EventArgs e)
            {
                cboDirectory.Items.Clear();
                foreach (string s in Directory.GetLogicalDrives())
                {
                    cboDirectory.Items.Add(s);
                }
                cboDirectory.Text = "C:\\";
            }
    
            void DirSearch(string sDir) 
            {
                try	
                {
                    foreach (string d in Directory.GetDirectories(sDir)) 
                    {
                        foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                        {
                            lstFilesFound.Items.Add(f);
                        }
                        DirSearch(d);
                    }
                }
                catch (System.Exception excpt) 
                {
                    Console.WriteLine(excpt.Message);
                }
            }
        }
    }
    Remarque Vous devez modifier le code dans Visual Studio 2005 et dans Visual Studio 2008. Dans les versions de Visual Studio antérieures à Visual Studio 2005, Visual C# ajoute un formulaire au projet lorsque vous créez un projet Windows Forms. Le formulaire est nommé Form1. Dans Visual C# 2005 et les versions suivantes, les deux fichiers représentant le formulaire sont nommés Form1.cs et Form1.designer.cs. Vous écrivez le code dans le fichier Form1.cs. Le concepteur Windows Forms écrit le code dans le fichier Form1.designer.cs.

    Pour convertir l'exemple de code pour Visual C# 2005 ou Visual C# 2008, créez une application Windows Visual C#, et procédez comme suit :
    1. Copiez l'objet Button, l'objet Text box et les autres objets Windows vers le formulaire Form1 de la classe partielle, dans le fichier Form1.Designer.cs.
    2. Ajoutez le contenu de la section de méthode InitializeComponent figurant dans le code ci-dessus à la méthode InitializeComponent dans le fichier Form1.Designer.cs. Collez le contenu après le contenu actuel de la méthode InitializeComponent.
    3. Copiez les méthodes suivantes à partir du code ci-dessus dans la classe Form1 du fichier Form1.cs :
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Ajoutez une instruction Using using System.IO ; dans le fichier Form1.cs.
    Pour plus d'informations sur le concepteur Windows Forms, reportez-vous au site Web de Microsoft Developper Network (MSDN) à l'adresse suivante :
    http://msdn.microsoft.com/fr-fr/library/ms173077.aspx
  6. Appuyez sur la touche F5 pour générer et exécuter l'exemple.

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
306777 Comment faire pour lire un fichier texte à l'aide de System.IO et Visual C#
Remarque Il s'agit d'un article de « PUBLICATION RAPIDE » rédigé directement au sein du service de support technique Microsoft. Les informations qui y sont contenues sont fournies en l'état, en réponse à des problèmes émergents. En raison du délai rapide de mise à disposition, les informations peuvent contenir des erreurs typographiques et, à tout moment et sans préavis, faire l'objet de révisions. Pour d'autres considérations, consultez les Conditions d'utilisation.

Propriétés

Numéro d'article: 303974 - Dernière mise à jour: vendredi 23 août 2013 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft Visual C# 2008 Express Edition
Mots-clés : 
kbhowtomaster kbio KB303974
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