C# - Encontrando arquivos conforme um critério
No artigo de hoje eu vou mostrar como localizar arquivos a partir de um critério em uma aplicação Windows Forms usando a linguagem C#. |
Hoje veremos como localizar arquivos com base em um critério
informado pelo usuário, exibindo os arquivos encontrados com seu caminho e nome
completos em um controle ListBox.
Os destaques desse projeto são:
Mostra como salvar e recuperar as preferências do usuário usando o objeto Properties
Mostra como usar o componente FolderBrowserDialog
Mostra como usar o controle ListBox
Mostra como localizar arquivos recursivamente
É um projeto simples mas que pode ser usado para aprender conceitos básicos importantes que são muito usados no dia a dia de um programador C#.
Recursos usados:
Criando o projeto no Visual Studio 2013 Express for windows desktop
Abra o VS 2013 Express for windows desktop e clique em New Project;
Selecione a linguagem Visual Basic e o template Windows Forms Application;
Informe o nome EncontrarArquivos e clique no botão OK;
Formulário principal do projeto form1.cs inclua os seguinte controles a partir da ToolBox:
3 Label
1 TextBox - txtPastaInicial
1 Combobox - cboPadraoArquivos
Na propriedade Items da Combobox defina os seguintes valores (fique a vontade para incluir outros padrões):
HTML (*.htm;*.html)
Text (*.txt)
All Files (*.*)
C# files (*.cs)
VB .NET modules (*.vb)
VB 6 Forms (*.frm)
VB 6 Modules (*.bas)
VB 6 Classes (*.cls)
All VB Files (*.frm;*.bas;*.cls,*.vb)
C Header Files (*.h)
All C Files (*.h;*.cpp;*.cxx)
PDF Files (*.pdf)
1 Button - btnDiretorioInicial
1 Listbox - lblArquivos
2 Buttons - btnLocalizar e btnSair
1 FolderBrowserDialog - fbd1
Disponha os controles no formulário form1.cs conforme o leiaute abaixo:
Vamos agora definir duas propriedades a nível de projeto para armazenar as preferências do usuário para a pasta inicial e para o padrão de arquivos.
Clique com o botão direito sobre o projeto e na janela de propriedades clique em Settings:
A seguir defina as propriedades PastaInicial e PadraoArquivos conforme mostra a figura abaixo:
Vamos agora definir o código no formulário form1.cs iniciando pela declaração dos namespaces usados:
using
System;using
System.IO;using
System.Windows.Forms;A seguir vamos definir o código no evento FormClosing do formulário que ocorre quando o formulário é fechado onde vamos salvar as preferências do usuário:
// Salva as configurações atuais
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Properties.Settings.Default.PastaInicial = txtPastaInicial.Text;
Properties.Settings.Default.PadraoArquivos = cboPadraoArquivos.Text;
Properties.Settings.Default.Save();
}
|
Para recuperar os valores salvos vamos incluir o código abaixo no evento Load do formulário:
// Recupera as configurações
private void Form1_Load(object sender, EventArgs e)
{
txtPastaInicial.Text = Properties.Settings.Default.PastaInicial;
cboPadraoArquivos.Text = Properties.Settings.Default.PadraoArquivos;
}
|
A seguir no evento Click do botão para definir a pasta inicial de busca defina o código a seguir:
//define a pasta inicial para buscar os arquivos
private void btnDiretorioInicial_Click(object sender, EventArgs e)
{
try
{
fbd1.SelectedPath = txtPastaInicial.Text;
if (fbd1.ShowDialog() == DialogResult.OK)
{
txtPastaInicial.Text = fbd1.SelectedPath;
}
}
catch
{
throw;
}
}
|
Agora no evento Click do botão Localizar inclua o código abaixo:
//Chama o método ProcurarArquivos passando os valores private void btnLocalizar_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(txtPastaInicial.Text) && cboPadraoArquivos.SelectedIndex != -1) { ProcuraArquivos(lbArquivos, txtPastaInicial.Text, cboPadraoArquivos.Text); } else { MessageBox.Show("Defina a pasta incial de busca e/ou o padrão de arquivos", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information); } } |
No código acima estamos chamando o método ProcurarArquivos() passando o ListBox, o diretório inicial e o padrão de arquivos como critério para localizar os arquivos.
O código do método ProcurarArquivos() é dado a seguir:
// Localiza arquivos que atendem o padrão definido private void ProcuraArquivos(ListBox lstb, string pastaInicial, string padrao) { try { // Limpa a listbox lbArquivos.Items.Clear(); // Define os padrões string[] padroes = AnalisaPadroes(padrao); DirectoryInfo dir_info = new DirectoryInfo(pastaInicial); //Procura no diretório usando os padrões ProcuraDiretorio(lstb, dir_info, padroes); //exibe mensagem MessageBox.Show("Foram encontrados " + lstb.Items.Count + " arquivos."); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
O código acima chama o método AnalisaPadroes() passando o padrão definido e a seguir o método ProcuraDiretorio() para localizar os arquivos.
Abaixo vemos o código do método AnalisaPadores():
private string[] AnalisaPadroes(string string_padrao)
{
try
{
// Pega tudo que esta entre os parenteses
if (string_padrao.Contains("("))
{
string_padrao = TextoEntre(string_padrao, "(", ")");
}
// divide a string em ;
string[] resultado = string_padrao.Split(';');
// Remove todos os padrões para espaço extra
for (int i = 0; i < resultado.Length; i++)
{
resultado[i] = resultado[i].Trim();
}
//retorna o resultado
return resultado;
}
catch
{
throw;
}
}
|
No código acima temos a chamada do método TextoEntre() cujo código é dado a seguir:
private string TextoEntre(string txt, string delimitador1, string delimitador2)
{
try
{
// Encontra o delimitador inicial
int pos1 = txt.IndexOf(delimitador1);
int texto_inicio = pos1 + delimitador1.Length;
int pos2 = txt.IndexOf(delimitador2, texto_inicio);
return txt.Substring(texto_inicio, pos2 - texto_inicio);
}
catch
{
throw;
}
}
|
A seguir temos o código do método ProcuraDiretorio() :
// Encontra os arquivos que atendem o padrão no diretorio
private void ProcuraDiretorio(ListBox lstb, DirectoryInfo dir_info, string[] padroes)
{
try
{
// Procura o diretorio
foreach (string padrao in padroes)
{
// Verifica o padrão
foreach (FileInfo Arq_info in dir_info.GetFiles(padrao))
{
// Processa o arquivo
ProcessaArquivo(lstb, Arq_info);
}
}
// Procura nos subdiretorios
foreach (DirectoryInfo subdir_info in dir_info.GetDirectories())
{
ProcuraDiretorio(lstb, subdir_info, padroes);
}
}
catch
{
throw;
}
}
|
No código acima chamamos o método ProcessaArquivo() passando o ListBox e a informação do arquivo. O código do método é dado abaixo:
private void ProcessaArquivo(ListBox lstb, FileInfo arq_info)
{
try
{
//exibe o nome do arquivo no listbox
lstb.Items.Add(arq_info.FullName);
}
catch (Exception ex)
{
MessageBox.Show("Erro ao processar o arquivo " + arq_info.FullName + "\n" + ex.Message);
}
}
|
Executando o projeto e definindo uma pasta inicial e um padrão de arquivo para localizar temos o seguinte resultado:
Você pode incrementar o projeto incluindo novas funcionalidades para tratar os arquivos encontrados.
Pegue o projeto completo aqui: EncontrarArquivos.zip
Dando graças
ao Pai que nos fez idôneos para participar da herança dos santos na luz;
O qual nos tirou da potestade das trevas, e nos transportou para o reino do
Filho do seu amor;
Colossenses 1:12-13
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
FSO - Tratando drives, diretórios e arquivos - Macoratti.net