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)) |
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
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Apresentando LINQ - Macoratti
C# - LINQ na prática - Macoratti.net
LINQ - Realizando consultas de referência cruzada com ... - Macoratti
LINQ - Revisando conceitos básicos - Macoratti
C# - Um pouco mais sobre LINQ Queries - Macoratti.net
LINQ to Objects - Realizando Consulta em Coleções de ... - Macoratti.net
NET - LINQ a seu dispor - Macoratti.net