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
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:
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
- Inicie um novo projeto de aplicativo Windows do C# .NET. Form1 é criado por padrão.
- No menu View, clique para exibir o Solution Explorer.
- No Solution Explorer, clique com o botão direito do mouse em Form1 e clique em View Code.
- Na janela de código Form1, realce e exclua todo o código existente.
- 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);
}
}
}
} - 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:
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