GetFiles com várias extensões

Duplicar Possível:
Você pode chamar Directory.GetFiles () com vários filtros?

Como você filtra em mais de uma extensão?

Eu tentei:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp"); FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp"); 

Por que não criar um método de extensão? Isso é mais legível.

 public static IEnumerable GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions) { if (extensions == null) throw new ArgumentNullException("extensions"); IEnumerable files = Enumerable.Empty(); foreach(string ext in extensions) { files = files.Concat(dir.GetFiles(ext)); } return files; } 

EDIT: uma versão mais eficiente:

 public static IEnumerable GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions) { if (extensions == null) throw new ArgumentNullException("extensions"); IEnumerable files = dir.EnumerateFiles(); return files.Where(f => extensions.Contains(f.Extension)); } 

Uso:

 dInfo.GetFilesByExtensions(".jpg",".exe",".gif"); 

Você pode obter todos os arquivos e filtrar a matriz:

 public static IEnumerable GetFilesByExtensions(this DirectoryInfo dirInfo, params string[] extensions) { var allowedExtensions = new HashSet(extensions, StringComparer.OrdinalIgnoreCase); return dirInfo.EnumerateFiles() .Where(f => allowedExtensions.Contains(f.Extension)); } 

Isso será (marginalmente) mais rápido que qualquer outra resposta aqui.
No .net 3.5, substitua EnumerateFiles por GetFiles (que é mais lento).

E usá-lo assim:

 var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4"); 

Você não pode fazer isso, porque GetFiles só aceita um único padrão de pesquisa. Em vez disso, você pode chamar GetFiles sem padrão e filtrar os resultados no código:

 string[] extensions = new[] { ".jpg", ".tiff", ".bmp" }; FileInfo[] files = dinfo.GetFiles() .Where(f => extensions.Contains(f.Extension.ToLower())) .ToArray(); 

Se você estiver trabalhando com o .NET 4, poderá usar o método EnumerateFiles para evitar o carregamento de todos os objects FileInfo na memory de uma só vez:

 string[] extensions = new[] { ".jpg", ".tiff", ".bmp" }; FileInfo[] files = dinfo.EnumerateFiles() .Where(f => extensions.Contains(f.Extension.ToLower())) .ToArray(); 

Você pode usar o método LINQ Union:

 dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray(); 

O seguinte recupera os arquivos jpg, tiff e bmp e fornece um IEnumerable sobre o qual você pode iterar:

 var files = dinfo.GetFiles("*.jpg") .Concat(dinfo.GetFiles("*.tiff")) .Concat(dinfo.GetFiles("*.bmp")); 

Se você realmente precisa de um array, simplesmente coloque .ToArray() no final disso.

Não tenho certeza se isso é possível. A referência do GetFiles do MSDN diz um padrão de pesquisa, não uma lista de padrões de pesquisa.

Eu poderia estar inclinado a buscar cada lista separadamente e “foreach” -los em uma lista final.

Eu sei que há uma maneira mais elegante de fazer isso e estou aberto a sugestões … foi isso que fiz:

  try { // Set directory for list to be made of DirectoryInfo jpegInfo = new DirectoryInfo(destinationFolder); DirectoryInfo jpgInfo = new DirectoryInfo(destinationFolder); DirectoryInfo gifInfo = new DirectoryInfo(destinationFolder); DirectoryInfo tiffInfo = new DirectoryInfo(destinationFolder); DirectoryInfo bmpInfo = new DirectoryInfo(destinationFolder); // Set file type FileInfo[] Jpegs = jpegInfo.GetFiles("*.jpeg"); FileInfo[] Jpgs = jpegInfo.GetFiles("*.jpg"); FileInfo[] Gifs = gifInfo.GetFiles("*.gif"); FileInfo[] Tiffs = gifInfo.GetFiles("*.tiff"); FileInfo[] Bmps = gifInfo.GetFiles("*.bmp"); // listBox1.Items.Add(@""); // Hack for the first list item no preview problem // Iterate through each file, displaying only the name inside the listbox... foreach (FileInfo file in Jpegs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Jpgs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Gifs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Tiffs) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } foreach (FileInfo file in Bmps) { listBox1.Items.Add(file.Name); Photo curPhoto = new Photo(); curPhoto.PhotoLocation = file.FullName; metaData.AddPhoto(curPhoto); } 

Eu estou usando o seguinte caminho para listar arquivos.

 '////cblSourceFiles is CHECK BOX LIST CONTROL <_asp:checkboxlist ID="cblSourceFiles" runat="server" DataTextField="Name" DataValueField="Name"> cblSourceFiles.DataSource = (New IO.DirectoryInfo(Path)).EnumerateFiles().Where(AddressOf ValidExtensions) cblSourceFiles.DataBind() Private Function ValidExtensions(ByVal pFi As System.IO.FileInfo, ByVal pSt As Integer) As Boolean Dim mRet As Boolean = False For Each mExt As String In ".jpg,.png".Split(",") '//// WebConfig.AllowedFiletypes If pFi.Extension.ToLower = mExt.ToLower Then mRet = True Exit For End If Next Return mRet End Function