【问题标题】:Want to list all Image Files in a folder using C# [duplicate]想要使用 C# 列出文件夹中的所有图像文件 [重复]
【发布时间】:2010-11-08 13:30:47
【问题描述】:

可能重复:
GetFiles with multiple extentions

是否有像 GetFiles 这样的函数,它需要超过 1 种文件类型,比如

DirectoryInfo di = new DirectoryInfo("c:/inetpub/wwwroot/demos");
FileInfo[] rgFiles = di.GetFiles("*.bmp, *.jpg, etc");

【问题讨论】:

  • 除了解决眼前的问题外,您还需要记住,文件的扩展名并不能保证其内容。

标签: c#


【解决方案1】:

AFAIK,这是不可能的。

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

HashSet<string> allowedExtensions = new HashSet<string>(extensionArray, StringComparer.OrdinalIgnoreCase);
FileInfo[] files = Array.FindAll(dirInfo.GetFiles(), f => allowedExtensions.Contains(f.Extension));

extensionArray 必须在每个扩展之前包含.,但不区分大小写。

【讨论】:

  • 我也可以像这样添加一个字符串数组吗?
  • 你可能是 EDIT 正在寻找allowedExtensions.UnionWith(extensionArray)。
  • 我认为他的意思是使用Directory.GetFiles方法。
  • 如果我有这样的数组 {".bmp",".jpg"...} 我如何将它添加到您的代码中?
  • @Shimmy:知道什么?试试 System.Drawing.Imaging 中的 ImageFormat 类。
【解决方案2】:

我不知道。 我实现了同样的问题:

DirectoryInfo di = new DirectoryInfo("c:/inetpub/wwwroot/demos");
FileInfo[] rgFiles = di.GetFiles("*.bmp")
    .Union(di.GetFiles("*.jpg"))
    .Union(di.GetFiles("etc"))
    .ToArray();

请注意,这需要 System.Linq 命名空间。

【讨论】:

  • @Codesleuth 你确定查询文件夹 3 次比只收集一次文件名的 Slacks 方法更有效
  • 我没有花太多时间来比较它的效率,但我可以猜测将目录的全部内容放入内存然后过滤在大多数情况下比从文件系统请求三个单独的过滤列表。就个人而言,我会使用 SLaks 的方法。
【解决方案3】:
【解决方案4】:

如果您希望您的代码是防弹的,因为您的文件检测机制检测到的图像文件不是基于扩展名而是基于文件的性质,您必须加载您的文件为 byte[] 并通常在数组的开头查找神奇的字节踪迹。每个图形文件都有自己的方式通过呈现字节的神奇值来向软件展示自己。如果您愿意,我可以发布一些代码示例。

【讨论】:

    【解决方案5】:

    不,没有。 Windows 无法在搜索模式中分离过滤器。 不过,这可以通过 LINQ 手动完成。

    通过使用 EnumerateFiles,您将在返回结果时获得结果,因此您无需等待所有文件即可开始处理结果。

            var directory = new DirectoryInfo("C:\\");
            var allowedExtensions = new string[] { ".jpg", ".bmp" };
    
            var imageFiles = from file in directory.EnumerateFiles("*", SearchOption.AllDirectories)
                             where allowedExtensions.Contains(file.Extension.ToLower())
                             select file;
    
            foreach (var file in imageFiles)
                Console.WriteLine(file.FullName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2013-05-01
      • 2020-11-12
      • 1970-01-01
      相关资源
      最近更新 更多