Directory.GetAllImageFiles Como devo fazer isso?
-
12-11-2019 - |
Pergunta
Gostaria de preencher um array String com todas as imagens encontradas em um diretório.
Até agora eu uso o seguinte para obter todas as imagens em formato jpg
Dim List() as string = Directory.GetFiles(Path, "*.jpg")
Agora gostaria de estendê-lo e obter todos os formatos de imagem.
Posso usar o directory.GetFiles combinado com um "ImageFormat
enumeração"?
Solução
Olá, você pode usar isso que encontrei como conteúdo da comunidade em http://msdn.microsoft.com/en-us/library/wz42302f.aspx.:
private static string[] GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter)).ToArray();
}
uma alternativa que usa avaliação lenta (somente .Net 4.0):
private static IEnumerable<string> GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter));
}
Você pode usá-lo como GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png")
.É essencialmente apenas uma pesquisa por cada filtro, por isso é não tão eficiente quanto possível.
Uma versão final é (é apenas .Net 4.0, mas pode ser transformada em uma solução 2.0 pelo menos):
private static IEnumerable<string> GetImageFiles(string sourceFolder)
{
return from file in System.IO.Directory.EnumerateFiles(sourceFolder)
let extension = Path.GetExtension(file)
where extension == ".jpg" || extension == ".gif" || extension == ".png"
select file;
}
Acredito que o último seja o mais rápido porque só faz um loop uma vez.Mas isso depende de como a busca de padrões é implementada em Directory
e como o sistema operacional pesquisa.É necessário um teste de desempenho que não fiz.
Outras dicas
Esta é a solução 2.0 .net.
Fiz algo semelhante em C#.Esta solução usou uma pasta como ponto de entrega para o processamento das imagens.Carregar cada tipo de arquivo como imagem não é a solução correta em todos os casos, mas eu queria validar cada arquivo como uma imagem carregável.
string[] files = Directory.GetFiles(folderPath);
foreach(string file in files)
{
System.Drawing.Image img = null;
try
{
img = System.Drawing.Image.FromFile(file);
}
catch
{
// do nothing
}
if (img != null)
{
// did something
img.Dispose();
}
}
Acontece que esqueci um pedaço...Antes de processar os arquivos, usei uma função para limitar o processamento dos arquivos:
private bool IsImage(FileInfo file)
{
bool imageFile = false;
if ((file.Extension.ToLower() ==".jpg")||
(file.Extension.ToLower() ==".gif")||
(file.Extension.ToLower() == ".bmp") ||
(file.Extension.ToLower() ==".png"))
{
imageFile = true;
}
return imageFile;
}