【问题标题】:Directory.GetAllImageFiles How should i do it?Directory.GetAllImageFiles 我应该怎么做?
【发布时间】:2011-02-12 22:58:32
【问题描述】:

我想用一个目录中找到的所有图像填充一个字符串数组。

到目前为止,我使用以下方法获取所有 jpg 格式的图像

Dim List() as string = Directory.GetFiles(Path, "*.jpg")

现在我想扩展它并获取所有图像格式。

我可以将 directory.GetFiles 与“ImageFormat 枚举”结合使用吗?

【问题讨论】:

  • 没有简单的选择。 ImageFormat 不包含扩展名。您应该将它们硬编码为静态数组或字典。

标签: .net vb.net enumeration image-formats getfiles


【解决方案1】:

您好,您可以使用我在http://msdn.microsoft.com/en-us/library/wz42302f.aspx 找到的社区内容。:

private static string[] GetFiles(string sourceFolder, string filters)
{
   return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter)).ToArray();
}

使用惰性评估的替代方法(仅限 .Net 4.0):

private static IEnumerable<string> GetFiles(string sourceFolder, string filters)
{
   return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter));
}

您可以像GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png") 一样使用它。它本质上只是对每个过滤器的搜索,因此它没有尽可能高效。

最终版本是(仅是 .Net 4.0,但至少可以制成 2.0 解决方案):

private static IEnumerable<string> GetImageFiles(string sourceFolder)
{
   return from file in System.IO.Directory.EnumerateFiles(sourceFolder)
          let extension = Path.GetExtension(file)
          where extension == ".jpg" || extension == ".gif" || extension == ".png"
          select file;
}

我相信最后一个是最快的,因为它只循环一次。但这取决于Directory 中模式搜索的实现方式以及操作系统的搜索方式。需要进行性能测试,但我没有做过。

【讨论】:

  • 哪个更快可能取决于存储设备的类型。我可以想象,如果大多数文件都被过滤掉,在低带宽网络上进行多次搜索可能会更快,但在本地硬盘上进行单次搜索会更快。
  • @CodeInChaos 是的,这取决于一系列事情。如果带有模式的GetFiles 使用 Windows Vista/7 的索引,或者文件树支持模式匹配(如后缀 trie),那么即使调用多次,提供过滤器也可能非常快。
【解决方案2】:

这是 2.0 .net 解决方案。

我在 C# 中做了类似的事情。此解决方案使用文件夹作为要处理的图像的下车点。将每种类型的文件加载为图像并不是在所有情况下都是正确的解决方案,但我想将每个文件验证为可加载的图像。

    string[] files = Directory.GetFiles(folderPath);
    foreach(string file in files)
    {


        System.Drawing.Image img = null;

        try
        {
            img = System.Drawing.Image.FromFile(file);
        }
        catch
        {
            // do nothing
        }

        if (img != null)
        {
            // did something

            img.Dispose();
        }
    }

原来我忘记了一块... 在处理文件之前,我确实使用了一个函数来限制正在处理的文件:

private bool IsImage(FileInfo file)
{
    bool imageFile = false;
    if ((file.Extension.ToLower() ==".jpg")||
       (file.Extension.ToLower() ==".gif")||
       (file.Extension.ToLower() == ".bmp") ||
       (file.Extension.ToLower() ==".png"))
    {
        imageFile = true;
    }

    return imageFile;
}

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2012-02-11
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2017-11-22
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多