C# - Procurando arquivos e/ou diretórios
Hoje vamos recordar como localizar um arquivo ou diretório pelo nome usando a linguagem C#. |
Existem muitas maneiras de implementar a localização de arquivos e diretórios na linguagem C# e neste artigo eu vou mostrar uma abordagem onde vamos usar o objeto DirectoryInfo que contém diversos métodos que nos ajudam nesta tarefa.
A classe DirectoryInfo expõe métodos de instância para criar, mover e enumerar em diretórios e subdiretórios. Essa classe não pode ser herdada é uma classe sealed.
Cabe ressaltar o alerta da documentação que avisa que : "Se você pretende reutilizar um objeto várias vezes, considere usar o método de instância do DirectoryInfo em vez dos métodos estáticos correspondentes da Directory classe, pois uma verificação de segurança nem sempre será necessária."
A seguir veremos um exemplo prático que pesquisa uma árvore de diretório para qualquer arquivo ou diretório que corresponde ao padrão de entrada.
recursos usados:
Criando o projeto no VS 2019 Community
Abra o VS 2019 e crie um novo projeto do tipo Console (.NET Core) chamado LocalizaArquivos:
A seguir crie uma classe no projeto chamada Localizador ou outro nome que você achar mais conveniente, e, inclua o código abaixo nesta classe:
using System;
using System.IO;
namespace LocalizaArquivos
{
public class Localizador
{
public static void ProcurarPor(string _diretorioInicial, string _criterioBusca, bool _somenteDiretorio)
{
DirectoryInfo di = new DirectoryInfo(_diretorioInicial);
DirectoryInfo[] diretorios = di.GetDirectories(_criterioBusca, SearchOption.AllDirectories);
int numResultados = diretorios.Length;
ExibirResultadoPesquisa(diretorios);
if (!_somenteDiretorio)
{
FileInfo[] arquivos = di.GetFiles(_criterioBusca, SearchOption.AllDirectories);
ExibirResultadoPesquisa(arquivos);
numResultados += arquivos.Length;
}
Console.WriteLine($"{ numResultados} resultados encontrados ");
}
private static void ExibirResultadoPesquisa(DirectoryInfo[] diretorios)
{
foreach (DirectoryInfo dir in diretorios)
{
Console.WriteLine($"{ dir.Name}\t{ dir.Parent}\t{ "D"}");
}
}
private static void ExibirResultadoPesquisa(FileInfo[] arquivos)
{
foreach (FileInfo arq in arquivos)
{
Console.WriteLine($"{ arq.Name}\t{ arq.DirectoryName}\t{ "F"}");
}
}
}
}
|
Na classe Localizador criamos o método estático:
Onde estamos passando os parâmetros informando o diretório inicial, o critério e se vamos procurar arquivos ou diretórios
A seguir criamos duas sobrecargas para o método ExibirResultadoPesquisa :
Onde o primeira exibe os diretórios e o segundo exibe os arquivos encontrados.
No método Main da classe Program incluímos o código a seguir para usar esta classe realizando uma validação bem simples da entrada do usuário apenas para mostrar o seu funcionamento:
using System;
namespace LocalizaArquivos
{
class Program
{
static bool _somenteDiretorio = false;
static string _diretorioInicial;
static string _criterioBusca;
static void Main(string[] args) { Console.WriteLine("########### Procurando arquivos ou diretórios ################\n"); Console.WriteLine("Informe o nome do diretório de início (Ex: c:\\dados) "); _diretorioInicial = Console.ReadLine(); Console.WriteLine("Informe o critério de busca (Ex: *.txt"); _criterioBusca = Console.ReadLine(); Console.WriteLine("Informe true para buscar diretórios e false para buscar arquivos"); var valor = Console.ReadLine(); if (valor.Equals("true") || valor.Equals("false")) { _somenteDiretorio = Convert.ToBoolean(valor); } else { _somenteDiretorio = false; } var resultado = _somenteDiretorio ? "(somente diretórios)" : "(arquivos)";
Console.WriteLine($"Procurando em : { _diretorioInicial} por : { resultado } criterio: { _criterioBusca} ");
Console.WriteLine("Tecle algo para iniciar...\n\n");
Console.ReadLine();
Localizador.ProcurarPor(_diretorioInicial,_criterioBusca, _somenteDiretorio);
Console.ReadLine();
}
}
}
|
Executando o projeto teremos o resultado abaixo :
Se você quiser tratar os argumentos de entrada no método Main a partir da linha de comando para exibir ao usuário como usar o método para localizar arquivos ou diretórios pode usar o seguinte código:
static void Main(string[] args)
{
if (!TrataArgumentos(args))
{
ExibirUtilizacao();
return;
}
....
...
static void ExibirUtilizacao()
{
Console.WriteLine("Uso: ProcurarPor[-diretório] CriterioDeBusca DiretorioInicial");
Console.WriteLine("Ex: Localizador.ProcurarPor -directory code C:\\Projetos");
Console.WriteLine("*coringas podem ser usados");
}
static bool TrataArgumentos(string[] args)
{
if (args.Length < 2)
{
return false;
}
if (string.Compare(args[0], "-directory") == 0)
{
_somenteDiretorio = true;
if (args.Length < 3)
return false;
}
_diretorioInicial = args[args.Length - 1];
_criterioBusca = args[args.Length - 2];
return true;
}
}
|
Pegue o projeto completo aqui: LocalizaArquivos.zip
"Quão grandes são, Senhor, as tuas obras! Mui profundos
são os teus pensamentos."
Salmos 92:5
Referências:
C# - Tasks x Threads. Qual a diferença
C# - Programação Assíncrona como : Asycn e Task
C# - O Struct Guid - Macoratti.net