ID do artigo: 303974 - Última revisão: quarta-feira, 9 de abril de 2003 - Revisão: 1.0

PROCEDIMENTOS: Pesquisar diretórios recursivamente utilizando o C# .NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Este artigo foi publicado anteriormente em BR303974
Este artigo descreve uma versão beta de um produto Microsoft. Estas informações são fornecidas no estado em que se encontram e estão sujeitas a alterações sem aviso prévio.

Não existe suporte formal a produto disponível por parte da Microsoft para este produto beta. Para obter informações sobre o suporte a uma versão beta, consulte a documentação incluída nos arquivos do produto beta ou verifique no site da Web a partir do qual foi feito o download da versão.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo demonstra através de código como pesquisar recursivamente subdiretórios para procurar por arquivos, iniciando com um diretório raiz. Uma seqüência de pesquisa é especificada para que você possa procurar por arquivos que correspondem a determinados critérios. Cada parte do código é explicada conforme necessário. Também é fornecido um exemplo de código funcional ao final do artigo.

A recursão em diretórios é uma tarefa de E/S comum para desenvolvedores. O FileSystemObject torna esta tarefa fácil para aplicativos de modelo de objeto componente (COM). Agora esta tarefa ficou ainda mais fácil no .NET. Como no FileSystemObject, as classes no espaço para nome System.IO oferecem uma abordagem orientada a objeto para acessar arquivos e diretórios.

Requisitos

  • Microsoft C# .NET Beta 2

Recursão de diretório

As classes de manipulação de arquivos e diretórios residem no espaço para nome System.IO. Antes de trabalhar com essas classes, você deve importar o seguinte espaço para nome em seu projeto:
using System.IO;
As classes do espaço para nome System.IO oferecem muitas opções para trabalhar com arquivos e diretórios. O espaço para nome System.IO não só fornece classes das quais você pode criar uma instância, como também fornece classes de utilitários de arquivos e diretórios. Essas classes contêm métodos estáticos que você pode chamar sem precisar declarar uma variável desse tipo. Por exemplo, você pode usar o objeto Directory para obter os subdiretórios de um determinado diretório.

O código a seguir usa o método estático GetDirectories do objeto Directory para retornar uma matriz de seqüências. Essa matriz contém nomes de caminhos dos subdiretórios do diretório C:\, caso existam.
string[] directories = Directory.GetDirectories("C:\\");
O objeto Directory também contém um método chamado GetFiles que permite recuperar uma matriz de seqüência de arquivos que correspondem a determinados critérios. O exemplo de código usa o objeto File para recuperar todos os arquivos do diretório C:\ que terminam com a extensão .dll:
string[] files = Directory.GetFiles("C:\\", "*.dll");
Os métodos GetDirectories e GetFiles do objeto Directory são tudo o que você precisa para pesquisar recursivamente arquivos que correspondem à seqüência de pesquisa. O método a seguir é usado para executar a recursão:
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);
	}
}
O código acima transmite uma seqüência, que contém o diretório que você deseja pesquisar, para DirSearch. Esse valor da seqüência é o nome do caminho completo do diretório. Você pode usar GetDirectories para recuperar os subdiretórios do diretório que é passado em seu procedimento. Como GetDirectories retorna uma matriz, você pode usar uma instrução for/each para iterações em cada subdiretório. Para cada subdiretório, use o método GetFiles para iterações nos arquivos nesse diretório. O valor da caixa de texto no seu formulário é transmitido para GetFiles. A caixa de texto contém a seqüência de pesquisa que filtra os resultados que GetFiles retorna. Se quaisquer arquivos corresponderem aos critérios de pesquisa, eles serão adicionados à caixa de listagem. Para cada subdiretório localizado, chame DirSearch novamente e passe o subdiretório. Usando essa chamada recursiva, você pode pesquisar todos os subdiretórios de um determinado diretório raiz.

Exemplo de código completo

  1. Inicie um novo projeto de aplicativo Windows do C# .NET. Form1 é criado por padrão.
  2. No menu View, clique para exibir o Solution Explorer.
  3. No Solution Explorer, clique com o botão direito do mouse em Form1 e clique em View Code.
  4. Na janela de código Form1, realce e exclua todo o código existente.
  5. Cole o seguinte código na janela 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);
                }
            }
        }
    }
  6. Pressione a tecla F5 para compilar e executar o exemplo.

REFERÊNCIAS

Para obter mais informações, consulte Microsoft .NET Framework SDK QuickStart Tutorials no seguinte site da Microsoft:
http://www.gotdotnet.com/quickstart (http://www.gotdotnet.com/quickstart)
Para obter informações adicionais, clique no número do artigo a seguir para exibir o artigo na Microsoft Knowledge Base:
306777  (http://support.microsoft.com/kb/306777/ ) HOW TO: Read a Text File Using System.IO and Visual C# .NET

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbhowto kbhowtomaster kbnokeyword KB303974