获取具有特定文件扩展名的路径的子目录

时间:2014-07-29 20:38:54

标签: c# .net file directory

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

例如

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

我能做到这一点吗?

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用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));
    }
}