【问题标题】:Getting subdirectories of a path that have specific file extensions获取具有特定文件扩展名的路径的子目录
【发布时间】:2014-09-21 08:53:53
【问题描述】:

我想知道是否有办法只检索具有特定扩展名的目录。

例如

List<string> directories = Directory.GetDirectories(sourceTextBox.Text, "*", SearchOption.AllDirectories).ToList();

会给我我给它的路径内的所有目录和子目录。但是我只希望它检索其中包含 .jpg 或 .png 文件的目录。

List<string> directories = Directory.GetDirectories(sourceTextBox.Text, "*.png", SearchOption.AllDirectories).ToList();
directories.addRange(Directory.GetDirectories(sourceTextBox.Text, "*.jpg", SearchOption.AllDirectories).ToList());

有什么办法可以做到这一点?

【问题讨论】:

    标签: c# .net file directory


    【解决方案1】:

    不保证性能,但是对于每个目录,您可以检查其文件以查看它是否包含任何具有匹配扩展名的文件:

    List<string> imageDirectories = Directory.GetDirectories(sourceTextBox.Text, "*", SearchOption.AllDirectories)
        .Where(d => Directory.EnumerateFiles(d)
            .Select(Path.GetExtension)
            .Where(ext => ext == ".png" || ext == ".jpg")
            .Any())
        .ToList();
    

    【讨论】:

      【解决方案2】:

      没有内置的方法,你可以试试这样的方法

      var directories = Directory
      .GetDirectories(path, "*", SearchOption.AllDirectories)
      .Where(x=> Directory.EnumerateFiles(x, "*.jpg").Any() || Directory.EnumerateFiles(x, "*.png").Any())
      .ToList();
      

      【讨论】:

        【解决方案3】:

        您可以使用Directory.EnumerateFiles 方法获取文件匹配条件,然后您可以使用Path.GetDirectoryName 获取它们的路径减去文件名并将其添加到HashSetHashSet 只会保留唯一的条目。

        HashSet<string> directories = new HashSet<string>();
        foreach(var file in Directory.EnumerateFiles(sourceTextBox.Text, 
                                                     "*.png",  
                                                     SearchOption.AllDirectories))
        {
            directories.Add(Path.GetDirectoryName(file));
        }
        

        要检查多个文件扩展名,您必须枚举所有文件,然后检查每个文件的扩展名,例如:

        HashSet<string> directories = new HashSet<string>();
        string[] allowableExtension = new [] {"jpg", "png"};
        foreach(var file in Directory.EnumerateFiles(sourceTextBox.Text,
                                                     "*", 
                                                     SearchOption.AllDirectories))
        {
            string extension = Path.GetExtension(file);
            if (allowableExtension.Contains(extension))
            {
                directories.Add(Path.GetDirectoryName(file));
            }
        }
        

        【讨论】:

        • 如果我还想找到 .jpg 扩展名,我会再做一个 foreach 循环吗?
        • @KelseyAbreu,是和否。您可以在不指定任何通配符的情况下使用EnumerateFiles,然后检查每个文件的扩展名是否为pngjpg,然后将其添加到文件中。
        猜你喜欢
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 2014-07-30
        • 2017-05-09
        • 2014-06-06
        • 1970-01-01
        • 2010-12-03
        相关资源
        最近更新 更多