Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取具有多个扩展名的文件_C#_.net_Fileinfo_Getfiles - Fatal编程技术网

C# 获取具有多个扩展名的文件

C# 获取具有多个扩展名的文件,c#,.net,fileinfo,getfiles,C#,.net,Fileinfo,Getfiles,可能重复: 如何筛选多个扩展 我试过: FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp"); FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp"); 我不确定这是否可行。MSDN GetFiles显示的是搜索模式,而不是搜索模式列表 我可能倾向于分别获取每个列表并将它们“foreach”到最终列表中。您不能这样做,因为GetFiles只接受一种搜索模式。相反,您可以无模式调用

可能重复:

如何筛选多个扩展

我试过:

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

我不确定这是否可行。MSDN GetFiles显示的是搜索模式,而不是搜索模式列表


我可能倾向于分别获取每个列表并将它们“foreach”到最终列表中。

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

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

FileInfo[] files =
    dinfo.GetFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();
如果使用.NET 4,可以使用
EnumerateFiles
方法避免一次性加载内存中的所有FileInfo对象:

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

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

以下内容检索jpg、tiff和bmp文件,并为您提供一个可迭代的
IEnumerable

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

如果你真的需要一个数组,只需将
.ToArray()
放在最后即可。

我知道有一种更优雅的方法可以做到这一点,我愿意接受建议。。。这就是我所做的:

          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);
          }

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

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;
}

您可以获取每个文件,然后过滤阵列:

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));
}

您可以使用LINQ Union方法:

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


我猜你的意思是“不止一个分机”。。。它不适用于两个eitheryeup不适用于两个eitherBTW,你知道GetFiles与C#无关,只与.NET有关吗?@JohnSaunders,你确定吗?@VikramNarkar:是的。您在中找不到它,并且它在VB.NET或任何其他CLR语言中也同样有效。如果目录中有许多文件,则效率将非常低……我最喜欢此解决方案,因为它简单易读。谢谢,我使用了.NET 4,并出现以下错误。我是新来的,所以很抱歉这是一个明显的修复:错误4'bool'不包含'ToArray'的定义,并且找不到接受'bool'类型的第一个参数的扩展方法'ToArray'(是否缺少using指令或程序集引用?)缺少右括号,我已明确修复了它。EnumerateFiles()性能更好。使用
HashSet
@SLaks可能会更快,这取决于扩展的数量。。。对于仅3个扩展,我认为差别不大。您不需要为每种类型创建单独的DirectoryInfo实例。。。而且有很多重复的代码,你应该用一个方法重构它们。不管怎样,我更新了我的答案来修复错误,你试过了吗?这是低效的。是的。看看我的答案。另外,您应该调用
SelectMany
而不是
Concat
returnextensions.SelectMany(dir.GetFiles)而不是如上所示检查扩展名,您可以使用第一个示例,将搜索模式传递到EnumerateFiles中,并且仍然能够对文件名进行检查,而不仅仅是能够检查扩展名,同时保持第二个示例的效率。为了避免丢失大写扩展名,我将向包含方法<代码>返回文件。其中(f=>extensions.Contains(f.Extension,StringComparer.OrdinalIgnoreCase))静态类扩展方法{公共静态文件信息[]GetFileByExtensions(此DirectoryInfo目录,参数字符串[]扩展名){如果(扩展名==null)抛出新的ArgumentNullException(“扩展名”);IEnumerable files=dir.EnumerateFiles();返回文件。其中(f=>extensions.Contains(f.Extension)).ToArray();}}}非常棒的解决方案,对我来说非常适合。我喜欢这是一行代码,这行代码可读性很强,目的也很清楚,我一眼就知道它在做什么,为什么。
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));
}
var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();