具有多个扩展名的GetFiles

rd4*_*d42 85 .net c# getfiles fileinfo

可能重复:
您可以使用多个过滤器调用Directory.GetFiles()吗?

如何过滤多个分机?

我试过了:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 66

您可以获取每个文件,然后过滤数组:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dirInfo, params string[] extensions)
{
    var allowedExtensions = new HashSet<string>(extensions, StringComparer.OrdinalIgnoreCase);

    return dirInfo.EnumerateFiles()
                  .Where(f => allowedExtensions.Contains(f.Extension));
}
Run Code Online (Sandbox Code Playgroud)

这将(略微)比这里的每个其他答案更快.
在.Net 3.5中,替换EnumerateFilesGetFiles(速度较慢).

并像这样使用它:

var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
Run Code Online (Sandbox Code Playgroud)


Che*_*hen 59

为什么不创建扩展方法?那更具可读性.

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

编辑:更高效的版本:

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

用法:

DirectoryInfo dInfo = new DirectoryInfo(@"c:\MyDir");
dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
Run Code Online (Sandbox Code Playgroud)

  • 这是低效的. (7认同)
  • 为了避免遗漏Capital Writred Extensions,我将StringComparer.OrdinalIgnoreCase添加到Contains-Method.`return files.Where(f => extensions.Contains(f.Extension,StringComparer.OrdinalIgnoreCase));` (3认同)
  • 是.看我的回答.另外,你应该调用`SelectMany`而不是`Concat`:`return extensions.SelectMany(dir.GetFiles);` (2认同)

Tho*_*que 51

你不能这样做,因为GetFiles只接受一个搜索模式.相反,您可以GetFiles不使用模式调用,并在代码中过滤结果:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.GetFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();
Run Code Online (Sandbox Code Playgroud)

如果您正在使用.NET 4,则可以使用该EnumerateFiles方法来避免一次性将所有FileInfo对象加载到内存中:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.EnumerateFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();
Run Code Online (Sandbox Code Playgroud)


Iev*_*ida 16

您可以使用LINQ Union方法:

dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();
Run Code Online (Sandbox Code Playgroud)


Tim*_*mwi 6

以下内容检索jpg,tiff和bmp文件,并为您提供IEnumerable<FileInfo>可以迭代的文件:

var files = dinfo.GetFiles("*.jpg")
    .Concat(dinfo.GetFiles("*.tiff"))
    .Concat(dinfo.GetFiles("*.bmp"));
Run Code Online (Sandbox Code Playgroud)

如果你真的需要一个阵列,那么就直接坚持.ToArray()到底.

  • 如果目录中有许多文件,那将是非常低效的... (3认同)