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:
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
- Inicie um novo projecto de aplicação do Visual C# Windows. Por predefinição, é criado um formulário é denominado Form1.
- No menu Ver , clique aqui para visualizar Solution Explorer.
- No Solution Explorer, clique com o botão direito do rato em Form1 e, em seguida, clique em Código .
- Na janela de código de Form1, realce e elimine todos os códigos existentes.
- 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:- 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.
- 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 .
- Copie os seguintes métodos do código acima para a classe Form1 no ficheiro de Form1.cs:
- btnSearch_Click
- Form1_Load
- DirSearch
- 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): - Prima F5 para compilar e executar o programa de exemplo.
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: