DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 303974 - Última revisão: sexta-feira, 23 de agosto de 2013 - Revisão: 1.0

Este artigo foi publicado anteriormente em BR303974
Para obter uma versão deste artigo referente ao Microsoft Visual C++ .NET, consulte 307009  (http://support.microsoft.com/kb/307009/pt-br/ ) .
Para obter uma versão deste artigo referente ao Microsoft Visual Basic .NET, consulte 306666  (http://support.microsoft.com/kb/306666/pt-br/ ) .

Este artigo se refere ao seguinte namespace do Microsoft .NET Framework Class Library:
  • System.IO

Nesta página

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):
    http://msdn.microsoft.com/pt-br/library/ms173077.aspx (http://msdn.microsoft.com/pt-br/library/ms173077.aspx)
  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  (http://support.microsoft.com/kb/306777/pt-br/ ) 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 (http://go.microsoft.com/fwlink/?LinkId=151500) para ver outras informações.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2008 Express Edition
Palavras-chave: 
kbhowtomaster kbio KB303974
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store