Cómo buscar directorios de manera recursiva utilizando Visual C#

Seleccione idioma Seleccione idioma
Id. de artículo: 303974 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E303974
Para obtener una versión de este artículo para Microsoft Visual C++ .NET, vea 307009.
Para obtener una versión de este artículo para Microsoft Visual Basic .NET, vea 306666.

Este artículo hace referencia al siguiente espacio de nombres de la Biblioteca de clases de Microsoft .NET Framework:
  • System.IO
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se muestra cómo buscar archivos en subdirectorios de forma recursiva en una aplicación Windows Forms de C# . Debe especificar una cadena de búsqueda de manera que pueda buscar archivos que cumplan determinados criterios comodín. Cada fragmento de código se explica según sea necesario. Al final de este artículo también se incluye un ejemplo de código que funciona.

La recursividad de directorios es una tarea de E/S habitual para los desarrolladores. El objeto FileSystemObject facilita esta tarea para las aplicaciones del Modelo de objetos componentes (COM). En .NET esta tarea resulta aún más sencilla. Al igual que FileSystemObject, las clases del espacio de nombres System.IO proporcionan un método orientado a objetos para obtener acceso a los archivos y directorios.

Requisitos

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

Recursividad de directorios

Las clases de tratamiento de directorios y archivos residen en el espacio de nombres System.IO. Antes de que pueda trabajar con estas clases, debe importar el siguiente espacio de nombres en el proyecto:
using System.IO;
El espacio de nombres System.IO proporciona muchas clases para trabajar con archivos y directorios. Estas clases incluyen clases de archivos, clases de directorio y clases de utilidad. Muchas de estas clases contienen métodos estáticos a los que puede llamarse sin tener que declarar una variable de ese tipo. Por ejemplo, puede utilizar el objeto Directory para obtener los subdirectorios de un directorio determinado.

El siguiente código utiliza el método estático GetDirectories del objeto Directory para devolver una matriz de cadenas. Esta matriz contiene nombres de rutas de directorio a los subdirectorios del directorio C, si existe alguno.
string[] directories = Directory.GetDirectories("C:\\");
El objeto Directory también contiene un método denominado GetFiles que permite recuperar una matriz de cadenas de archivos que cumplen determinados criterios. El ejemplo de código siguiente utiliza el objeto File para recuperar todos los archivos del directorio C que tienen la extensión .dll:
string[] files = Directory.GetFiles("C:\\", "*.dll");
Los métodos GetDirectories y GetFiles del objeto Directory son todo lo que se necesita para buscar archivos que coincidan con los criterios de búsqueda de forma recursiva. El siguiente método se utiliza para efectuar la recursividad:
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);
	}
}
El código anterior transfiere una cadena (que contiene el directorio en el que desea buscar) a DirSearch. El valor de la cadena es el la ruta de acceso completa del directorio. Puede utilizar GetDirectories para recuperar los subdirectorios del directorio que se pasa al procedimiento. Dado que GetDirectories devuelve una matriz, puede utilizar una instrucción for/each para buscar en cada subdirectorio. En cada subdirectorio, utilice el método GetFiles para buscar en los archivos de ese directorio. El valor del cuadro de texto del formulario se pasa a GetFiles. El cuadro de texto contiene la cadena de búsqueda que filtra los resultados devueltos por GetFiles. Si algún archivo coincide con los criterios de búsqueda, se agregarán al cuadro de lista. Para cada subdirectorio que se encuentre, vuelva a llamar a DirSearch y pásele un subdirectorio. Con esta llamada recursiva, podrá buscar en todos los subdirectorios de un directorio raíz determinado.

Ejemplo de código completo

  1. Inicie un nuevo proyecto de aplicación de Windows Visual C# . De forma predeterminada, se crea un formulario denominado Form1.
  2. En el menú Ver, haga clic para mostrar el Explorador de soluciones.
  3. En el Explorador de soluciones, haga clic con el botón secundario en Form1 y, a continuación, haga clic en Ver código.
  4. En la ventana de código de Form1, resalte y, después, elimine todo el código existente.
  5. Pegue el código siguiente en la ventana de código 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);
                }
            }
        }
    }
    Nota: debe cambiar el código en Visual Studio 2005 y en Visual Studio 2008. En las versiones de Visual Studio anteriores a Visual Studio 2005, Visual C# agrega un formulario al proyecto cuando se crea un proyecto de Windows Forms. El formulario se denomina Form1. En Visual C# 2005 y versiones posteriores, los dos archivos que lo representan el formulario se denominan Form1.cs y Form1.designer.cs. Debe escribir el código en el archivo Form1.cs. El Diseñador de Windows Forms escribe el código en el archivo Form1.designer.cs.

    Para convertir el código de ejemplo a Visual C# 2005 o Visual C# 2008, cree una nueva aplicación para Windows de Visual C# y, a continuación, siga estos pasos:
    1. Copie el objeto Button, el objeto Text box y cualquier otro objeto de Windows a la clase parcial Form1 en el archivo Form1.Designer.cs.
    2. Agregue el contenido de la sección del método InitializeComponent del código anterior al método InitializeComponent en el archivo Form1.Designer.cs Pegue el contenido después del contenido actual del método InitializeComponent.
    3. Copie los siguientes métodos del código anterior en la clase Form1 del archivo Form1.cs:
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Agregue una instrucción using System.IO al archivo Form1.cs.
    Para obtener más información acerca del Diseñador de Windows Forms, visite el siguiente sitio web de Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/es-es/library/ms173077.aspx
  6. Presione F5 para generar y ejecutar el programa de ejemplo.

Referencias

Para obtener más información al respecto, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
306777 Cómo leer un archivo de texto mediante System.IO y Visual C#
Nota: es un artículo de "PUBLICACIÓN RÁPIDA" creado directamente por la organización de soporte técnico de Microsoft. La información aquí contenida se proporciona como está, como respuesta a problemas que han surgido. Como consecuencia de la rapidez con la que lo hemos puesto disponible, los materiales podrían incluir errores tipográficos y pueden ser revisados en cualquier momento sin previo aviso. Vea las Condiciones de uso para otras consideraciones

Propiedades

Id. de artículo: 303974 - Última revisión: viernes, 23 de agosto de 2013 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2008 Express Edition
Palabras clave: 
kbhowtomaster kbio KB303974

Enviar comentarios

 

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