Você está offline; aguardando reconexão

Como procurar diretórios recursivamente utilizando o Visual C#

Este artigo foi publicado anteriormente em BR303974
Para obter uma versão deste artigo referente ao Microsoft Visual C++ .NET, consulte 307009.
Para obter uma versão deste artigo referente ao Microsoft Visual Basic .NET, consulte 306666.

Este artigo se refere ao seguinte namespace do Microsoft .NET Framework Class Library:
  • System.IO
Sumário
Este artigo passo a passo mostra como pesquisar recursivamente por arquivos nos subdiretórios em um aplicativo do C# Windows Forms. Uma sequência de pesquisa é especificada para que seja possível pesquisar por arquivos que correspondem a determinados critérios de curinga. Cada parte do código é explicada conforme necessário. Uma amostra de código de trabalho também é fornecido no final do artigo.

A recursão de diretório é uma tarefa comum de ES para os desenvolvedores. O FileSystemObject torna essa tarefa fácil para aplicativos COM (Component Object Model). Agora, esta tarefa tornou-se ainda mais fácil no .NET. Semelhante ao FileSystemObject, as classes no namespace System.IO fornecem uma forma orientada pelo objeto para acessar arquivos e diretórios.

Requisitos

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

Recursão de diretório

As classes de manipulação de arquivo e diretório residem no namespace System.IO. Antes de trabalhar com essas classes, você deve importar o seguinte namespace para o projeto:
using System.IO;
As classes do namespace System.IO fornecem muitas classes que permitem que você trabalhe com arquivos e diretórios. Essas classes incluem classes de arquivos, classes de diretório e classes de utilitários. Muitas destas classes contém métodos estáticos que podem ser chamados sem ter que declarar uma variável daquele tipo. Por exemplo, você pode usar o objeto de Diretório para obter os subdiretórios de um determinado diretório.

O código a seguir usa o método estático GetDirectories do objeto de Diretório para retornar uma matriz de cadeias. Esta matriz contém nomes de caminho de diretório para os subdiretórios do diretório C, se houver.
string[] directories = Directory.GetDirectories("C:\\");
O objeto de Diretório também contém um método chamado de GetFiles que permite que recuperar uma matriz de cadeias de arquivos que correspondam a um determinado critério. A seguinte amostra de código usa o objeto de Arquivo para recuperar todos os arquivos no diretório C que terminam com a extensão .dll:
string[] files = Directory.GetFiles("C:\\", "*.dll");
Os métodos GetDirectories e GetFiles do objeto de Diretório é tudo o que você precisa para pesquisar recursivamente por arquivos que correspondam a cadeia 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 anterior passa uma sequência de caracteres que contém o diretório que você deseja pesquisar, para DirSearch. Esse valor de sequência de caracteres é o caminho completo do diretório. É possível usar o GetDirectories para recuperar os subdiretórios do diretório que é passado para o procedimento. Já que o GetDirectories retorna uma matriz,é possível usar uma para/cada instrução para iterar sobre cada subdiretório. Para cada subdiretório, use o método GetFiles para iterar sobre os arquivos naquele diretório. O valor da caixa de texto no formulário é passado para GetFiles. Na caixa de texto contém a cadeia de pesquisa que filtra os resultados que o GetFiles retorna. Se todos os arquivos correspondem aos critérios de pesquisa, eles são adicionados à caixa de lista. Para cada subdiretório que está localizado, chame o DirSearch novamente e passe a ele um subdiretório. Ao usar esta chamada recursiva, é possível pesquisar todos os subdiretórios de um determinado diretório raiz.

Amostra de código completo

  1. Inicie um novo projeto de aplicativo do Visual C# Windows. Por padrão, um formulário que é denominado Form1 é criado.
  2. No menu Exibir, clique para exibir o Gerenciador de Soluções.
  3. No Gerenciador de Soluções, clique com o botão direito em Form1 e clique em Exibir Código.
  4. Na janela do código Form1, destaque e exclua todos os códigos existentes.
  5. Cole o código a seguir na janela de código do 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);            }        }    }}
    Observação É necessário alterar o código no Visual Studio 2005 e no Visual Studio 2008. Nas versões do Visual Studio que são anteriores ao Visual Studio 2005, o Visual C# adiciona uma forma ao projeto quando um projeto é criado no Windows Forms. O formulário é denominado Form1. No Visual C# 2005 e em versões posteriores, os dois arquivos que representam o formulário são denominados Form1.cs e Form1.designer.cs. Os códigos são gravados no arquivo Form1.cs. O Windows Forms Designer grava código no arquivo Form1.designer.cs.

    Para converter a amostra de código para o Visual C# 2005 ou para o Visual C# 2008, crie um novo aplicativo do Visual C# Windows e sega estas etapas:
    1. Copie o objeto do Botão, o objeto da Caixa de texto e outros objetos do Windows para o Form1 de classe parcial no arquivo Form1.Designer.cs.
    2. Adicione os conteúdos da seção do método InitializeComponent no código acima do método InitializeComponent no arquivo Form1.Designer.cs. Cole o conteúdo depois do conteúdo atual do método InitializeComponent.
    3. Copie os seguintes métodos do código acima para a classe Form1 no arquivo Form1.cs:
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Adicione um usando System.IO; usando a instrução no arquivo Form1.cs.
    Para obter mais informações sobre o Windows Forms Designer, visite o seguinte site do Microsoft Developer Network (MSDN):
  6. Pressione para F5 para criar e executar o programa de amostra.
Referências
Para obter mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
306777 Como ler um arquivo de texto usando System.IO e o Visual C#
Observação: este é um artigo de “PUBLICAÇÃO RÁPIDA” criado diretamente pela organização de suporte da Microsoft. As informações aqui contidas são fornecidas no presente estado, em resposta a questões emergentes. Como resultado da velocidade de disponibilização, os materiais podem incluir erros tipográficos e poderão ser revisados a qualquer momento, sem aviso prévio. Consulte os Termos de Uso para ver outras informações.
Propriedades

ID do Artigo: 303974 - Última Revisão: 08/23/2013 14:37:00 - Revisão: 1.0

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2008 Express Edition

  • kbhowtomaster kbio KB303974
Comentários