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:

É 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:

    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)

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:


José Carlos Macoratti