首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个扩展的GetFiles

具有多个扩展的GetFiles
EN

Stack Overflow用户
提问于 2010-08-20 07:55:29
回答 7查看 134.8K关注 0票数 99

可能重复:

Can you call Directory.GetFiles() with multiple filters?

如何过滤多个分机?

我试过了:

代码语言:javascript
复制
FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-08-20 10:15:09

为什么不创建一个扩展方法呢?这更具可读性。

代码语言:javascript
复制
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;
}

编辑:更高效的版本:

代码语言:javascript
复制
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));
}

用法:

代码语言:javascript
复制
DirectoryInfo dInfo = new DirectoryInfo(@"c:\MyDir");
dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
票数 74
EN

Stack Overflow用户

发布于 2010-11-08 21:53:58

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

代码语言:javascript
复制
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));
}

这将比这里的所有其他答案(略微)快。

在.Net 3.5中,将EnumerateFiles替换为GetFiles (速度较慢)。

并像这样使用它:

代码语言:javascript
复制
var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
票数 72
EN

Stack Overflow用户

发布于 2010-08-20 08:12:14

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

代码语言:javascript
复制
string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.GetFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();

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

代码语言:javascript
复制
string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.EnumerateFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();
票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3527203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档