Artigo: 303974 - Última revisão: terça-feira, 28 de Agosto de 2007 - Revisão: 3.5

Como directórios de procura recursivamente utilizando o Visual C#

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.
Para obter uma versão de Microsoft Visual C++ .NET deste artigo, consulte 307009  (http://support.microsoft.com/kb/307009/ ) .
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 306666  (http://support.microsoft.com/kb/306666/ ) .

Este artigo faz referência à seguinte espaço de nomes Microsoft .NET Framework Class Library:
  • System.IO

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo passo a passo mostra como recursivamente subdirectórios de procura de ficheiros de uma aplicação do C# Windows Forms. Uma cadeia de procura é especificada para que pode procurar ficheiros que correspondam a um determinado critério de caracteres universais. Cada parte do código é explicado conforme for necessário. Um exemplo de código de trabalho também é fornecido no fim do artigo.

Directório recursividade é uma tarefa E/S comum para programadores. FileSystemObject facilita esta tarefa para o COM (Component Object Model) aplicações. Agora esta tarefa tornou ainda mais fácil no. NET. Tal como FileSystemObject , as classes no espaço de nomes System.IO fornecem uma forma orientada para aceder a ficheiros e directórios.

Requisitos

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

Directório recursividade

As classes de manipulação de ficheiros e directórios residem no espaço de nomes System.IO . Antes de trabalhar com estas classes, deve importar o espaço de nomes seguinte no projecto:
using System.IO;
as classes do espaço de nomes de System.IO fornecem muitas classes que lhe permitem trabalhar com ficheiros e directórios. Estas classes de incluem ficheiro classes, classes de directório e classes de utilitário. Muitas destas classes contêm métodos estáticos que podem ser chamados sem ter de declarar uma variável desse tipo. Por exemplo, pode utilizar o objecto para obter os subdirectórios de um determinado directório.

O código seguinte utiliza o método GetDirectories estático do objecto para devolver uma matriz de cadeias. Esta matriz contém nomes de caminho de directório para os subdirectórios do directório C, se existir.
string[] directories = Directory.GetDirectories("C:\\");
o objecto de directório também contém um método chamado GetFiles que lhe permite obter uma matriz de cadeia de ficheiros que correspondam a um determinado critério. O código de exemplo seguinte utiliza o objecto de ficheiro para obter todos os ficheiros no directório C que terminam com uma extensão .dll:
string[] files = Directory.GetFiles("C:\\", "*.dll");
os métodos GetDirectories e GetFiles de objecto do são tudo o que terá de procurar ficheiros que correspondem à cadeia procura recursivamente. O seguinte método é utilizado para efectuar a recursividade:
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 precedente transmite uma cadeia, que contém o directório que pretende procurar, DirSearch . Este valor de cadeia é o caminho completo do directório. Pode utilizar GetDirectories para obter os subdirectórios do directório que é transmitido para o procedimento. Uma vez que GetDirectories devolve uma matriz, pode utilizar um para/cada instrução para iterar através de cada subdirectório. Para cada subdirectório, utilize o método GetFiles para iterar através de ficheiros no directório. O valor da caixa de texto no formulário é transferido para GetFiles . A caixa de texto contém a cadeia de procura que filtra os resultados GetFiles devolve. Se quaisquer ficheiros corresponder os critérios de procura, estas são adicionadas à sua caixa de listagem. Para cada subdirectório que se encontra, chame novamente DirSearch e transmiti-las um subdirectório. Utilizando esta chamada recursiva, pode procurar todos os subdirectórios de um directório raiz especificado.

Exemplo de código completo

  1. Inicie um novo projecto de aplicação do Visual C# Windows. Por predefinição, é criado um formulário é denominado Form1.
  2. No menu Ver , clique aqui para visualizar Solution Explorer.
  3. No Solution Explorer, clique com o botão direito do rato em Form1 e, em seguida, clique em Código .
  4. Na janela de código de Form1, realce e elimine todos os códigos existentes.
  5. Cole o seguinte código 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);
                }
            }
        }
    }
    NOTA: tem de alterar o código no Visual Studio 2005 e no Visual Studio 2008. Nas versões anteriores ao Visual Studio 2005 do Visual Studio, Visual C# adiciona um formulário ao projecto quando cria um projecto de Windows Forms. O formulário é denominado Form1. No Visual C# 2005 e nas versões posteriores, os dois ficheiros que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever código no ficheiro Form1.cs. O Windows Forms Designer escreve código no ficheiro Form1.Designer.cs.

    Para converter o código de exemplo para o Visual C# 2005 ou para o Visual C# 2008, criar uma nova aplicação Visual C# Windows e, em seguida, siga estes passos:
    1. Copie o objecto de botão , o objecto de caixa de texto e outros objectos do Windows à classe Form1 no ficheiro Form1.Designer.cs parcial.
    2. Adicione o conteúdo da secção método InitializeComponent no código acima para o método InitializeComponent no ficheiro Form1.Designer.cs. Cola o conteúdo depois do conteúdo actual do método InitializeComponent .
    3. Copie os seguintes métodos do código acima para a classe Form1 no ficheiro de Form1.cs:
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Adicione um utilizando System.IO; utilizando a instrução para o ficheiro de Form1.cs.
    Para obter mais informações sobre o Windows Forms Designer, visite o seguinte Web site da Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
  6. Prima F5 para compilar e executar o programa de exemplo.

Referências

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
306777  (http://support.microsoft.com/kb/306777/ ) Como ler um ficheiro de texto utilizando System.IO e Visual C#
Para informações gerais sobre Visual C#. NET, consulte a newsgroups Usenet seguinte:
microsoft.public.dotnet.languages.csharp (http://go.microsoft.com/fwlink/?linkid=5217)

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: 
kbmt kbhowtomaster kbio KB303974 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 303974  (http://support.microsoft.com/kb/303974/en-us/ )