LINQ - Acessando e exibindo arquivos


Hoje vamos recordar como usar consultas LINQ para acessar e exibir informações de arquivos.

Se você não conhece a LINQ - Language Integrated Query -, ela é um conjunto de recursos introduzidos no .NET Framework 3.5 que permitem a realização de consultas diretamente em base de dados , documentos XML , estrutura de dados , coleção de objetos ,etc. usando uma sintaxe parecida com a linguagem SQL.

Nas referências vou deixar diversos links para artigos que tratam de toda a teoria e exemplos práticos da LINQ.

Hoje vou mostrar mais uma forma prática de usar consultas LINQs para acessar e obter informações de arquivos exibindo-as em um formulário Windows Forms.

Então vamos la´...

Criando o projeto Windows Forms

Vamos criar um vou criar um projeto Windows Desktop usando o template Windows Forms App(.NET Framework)  usando o VS 2017 Community com o nome WF_LinqArquivos;

A partir da ToolBox inclua no formulário Form1.cs os controles:

Precisamos referenciar no projeto o pacote Microsoft.VisualBasic para poder usar a função InputBox:

Vamos definir o código do formulário.

Namespaces usados no formulário

using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;

Variáveis definidas no início do formulário:

string Tamanho = "";
string Extensao = "";
string caminhoDiretorio = "";
DirectoryInfo dirInfo = null;

1- Código do evento Click do botão para selecioinar o diretório

Nos eventos Click dos botões btnLocalizar vamos usar o FolderBrowserDialog para permitir o usuário selecionar uma pasta de origem:

        private void btnLocalizar_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd1 = new FolderBrowserDialog();
            DialogResult resultado = fbd1.ShowDialog();
            // Define as propriedades do controle FolderBrowserDialog
            fbd1.Description = "Selecione uma pasta";
            fbd1.RootFolder = Environment.SpecialFolder.MyComputer;
            fbd1.ShowNewFolderButton = true;
            // Exibe a caixa de diálogo
            if (resultado == DialogResult.OK)
            {
                // Exibe a pasta selecionada
                txtDiretorio.Text = fbd1.SelectedPath;
            }
        }

2- Código do método Validacao()

O código deste método recebe a pasta origem e verifica se ela existe e se ela possui um nome válido.

        private bool Validacao(string origem)
        {
            if (string.IsNullOrEmpty(origem))
            {
                MessageBox.Show("O diretório é inválido...");
                return false;
            }
            if (!Directory.Exists(origem))
            {
                MessageBox.Show("O diretório não existe...");
                return false;
            }
            return true;
        }

3- Código do método GetInfoDiretorio()

O código deste método vamos criar uma instância da classe DirectoryInfo para a pasta de origem para expor métodos de instância para criar, mover e enumerar em diretórios e subdiretórios.

        private DirectoryInfo GetInfoDiretorio()
        {
            caminhoDiretorio = txtDiretorio.Text;
            DirectoryInfo dirInfo = new DirectoryInfo(caminhoDiretorio);
            return dirInfo;
        }

4- Código do botão para Exibir todos os arquivos da pasta de origem

No evento Click do botão btnTodosArquivos temos o código que vai obter e exibir todos os arquivos da pasta:

        private void btnTodosArquivos_Click(object sender, EventArgs e)
        {
            if (Validacao(txtDiretorio.Text))
            {
                try
                {
                    lbArquivos.Items.Clear();
                    dirInfo = GetInfoDiretorio();
                    var arquivos = dirInfo.GetFiles("*.*").Select(file => file.Name);
                    foreach (var arq in arquivos)
                    {
                        lbArquivos.Items.Add(arq);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro : " + ex.Message);
                }
            }
        }

5- Código do botão para Exibir os arquivos agrupados por extensão

No evento Click do botão btnAgrupadosPorExtensao primeiro obtemos todos os arquivos e a seguir fazemos uma agrupamento destes arquivos por extensão exibindo cada grupo totalizado :

      private void btnAgrupadosPorExtensao_Click(object sender, EventArgs e)
        {
            if (Validacao(txtDiretorio.Text))
            {
                try
                {
                    lbArquivos.Items.Clear();
                    dirInfo = GetInfoDiretorio();
                    var arquivos = dirInfo.GetFiles("*.*").Select(file => file.Name);
                    var arquivosAgrupadosPorExtensao = arquivos.Select(file =>
                             Path.GetExtension(file)
                             .TrimStart('.')
                             .ToLower())
                             .GroupBy(x => x, (ext, extCnt) => new
                             {
                                 Extensao = ext,
                                 Quantidade = extCnt.Count()
                             });
                    foreach (var arq in arquivosAgrupadosPorExtensao)
                    {
                        lbArquivos.Items.Add(arq);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro : " + ex.Message);
                }
            }
        }

6- Código do botão para Exibir os arquivos maior que um valor

No evento Click do botão btnMaioresQue estamos usando um Inputbox para que o usuário informa o valor a partir do qual os arquivos serão exibidos :

         private void btnMaioresQue_Click(object sender, EventArgs e)
        {
            string Prompt = "Informe o tamanho";
            string Titulo = "Exibe arquivo maior que (bytes) : ";
            Tamanho = Microsoft.VisualBasic.Interaction.InputBox(Prompt, Titulo, "100", 650, 350);

            if (!string.IsNullOrWhiteSpace(Tamanho))
            {
                int tamanhoArquivo = Convert.ToInt32(Tamanho);
                if (tamanhoArquivo > 99 )
                {
                    GetArquivosMaioresQue(tamanhoArquivo);
                }
            }
        }

Após verificar se o valor informado não é menor que 99 invocamos o método GetArquivosMaioresQue() cujo código vamos abaixo:

       private void GetArquivosMaioresQue(int tamanho)
        {
            try
            {
                dirInfo = GetInfoDiretorio();
                FileInfo[] files = dirInfo.GetFiles("*.*", SearchOption.AllDirectories);
                var query = from file in files
                                where file.Length > tamanho * tamanho
                                select "Nome: " + file.Name + "\tTamanho: " + file.Length.ToString() + " bytes";
                foreach (string str in query)
                {
                    lbArquivos.Items.Add(str);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

Após obter todos os arquivos da pasta aplicamos uma consulta LINQ para filtrar os arquivos conforme o critério de tamanho informado.

7- Código do botão para Exibir os arquivos com uma extensão específica

No evento Click do botão btnArquivosDeExtensao usamos novamente a função InputBox para o usuário informar a estensão dos arquivos que deseja exibir:

       private void btnArquivosDeExtensao_Click(object sender, EventArgs e)
        {
            string Prompt = "Informe o tamanho";
            string Titulo = "Exibe arquivo com extensão igual a : ";
            Extensao = Microsoft.VisualBasic.Interaction.InputBox(Prompt, Titulo, ".txt", 650, 350);
            if (!string.IsNullOrWhiteSpace(Extensao))
            {
                GetArquivosComExtensao(Extensao);
            }
        }       

Após validar a informação chamamos o método GetArquivosComExtensao() que possui o seguinte código:

       public void GetArquivosComExtensao(string extensao)
        {
            if (Validacao(txtDiretorio.Text))
            {
                try
                {
                    lbArquivos.Items.Clear();
                    dirInfo = GetInfoDiretorio();
                    var arquivos = dirInfo.GetFiles("*.*", SearchOption.AllDirectories)
                                        .Where(file =>
                                        file.Name.EndsWith(extensao))
                                       .Select(file => file.Name).ToList();
                    foreach (var arq in arquivos)
                    {
                        lbArquivos.Items.Add(arq);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro : " + ex.Message);
                }
            }
        }

Executando o projeto iremos obter:

Pegue o código do projeto aqui :  WF_LinqArquivos.zip

"Aquele que nem mesmo a seu próprio Filho poupou, antes o entregou por todos nós, como nos não dará também com ele todas as coisas ? "
Romanos 8:32

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