Directory.EnumerateFiles方法:如何枚举指定子目录中的文件

本文关键字:子目录 文件 枚举 方法 EnumerateFiles 何枚举 Directory | 更新日期: 2023-09-27 18:00:09

假设以下目录结构。"C:''Genre"answers"Genre"目录,该目录有几个子目录:"Rock"、"Pop"、"Metal"、"Jazz"。

如何调整以下语句以仅在"Rock"answers"Metal"子目录中搜索?

var myFiles = Directory.
    EnumerateFiles("C:'Genre", "*", SearchOption.AllDirectories).
    Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif"));

Directory.EnumerateFiles方法:如何枚举指定子目录中的文件

我认为干净的方法是搜索您想要的每个目录,然后将它们添加到myFiles

var rockFiles = Directory.EnumerateFiles("c:'Genre'Rock", "*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif"));
var metalFiles = Directory.EnumerateFiles("c:'Genre'Metal", "*", SearchOption.AllDirectories).Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif"));
var myFiles = RockFiles.Concat(MetalFiles);

现在,如果你想要一种通用的方法来做到这一点,那就另当别论了,而且有点复杂:)

请考虑一些类似以下的实现:

public static class Program
{
    public static void Main()
    {
        var directoryPaths = new List<string>
            {
                @"C:'root'path_1",
                @"C:'root'path_2",
                @"C:'root'path_3"
                // …
            };
        var searchPatterns = new List<string>
            {
                "*.jpg",
                "*.gif"
            };
        var filePaths = directoryPaths
            .SelectMany(directoryPath =>
                EnumerateFiles(directoryPath, searchPatterns, SearchOption.AllDirectories))
            .ToList()
            .AsReadOnly();
        // …
    }
    private static IEnumerable<string> EnumerateFiles(
        string path,
        IEnumerable<string> searchPatterns,
        SearchOption searchOption)
    {
        var filePaths = searchPatterns.SelectMany(
            searchPattern => Directory.EnumerateFiles(path, searchPattern, searchOption));
        return filePaths;
    }
}

使用Linq中的Concat将文件合并到两个目录中。

var rockFiles = Directory.
EnumerateFiles("C:'Genre'Rock", "*", SearchOption.AllDirectories);
var metalFiles = Directory.
EnumerateFiles("C:'Genre'Metal", "*", SearchOption.AllDirectories);
var myFiles = rockFile
.Concat(metalFiles)
.Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif"));

您可以使用两个数组作为扩展和Path-class:

var myFiles = Directory.EnumerateFiles(@"C:'Temp'Genre", "*", SearchOption.AllDirectories)
    .Where(fn => genres.Contains(Path.GetFileName(Path.GetDirectoryName(fn)), StringComparer.InvariantCultureIgnoreCase) 
          && extensions.Contains(Path.GetExtension(fn), StringComparer.InvariantCultureIgnoreCase));

Path.GetFileName(Path.GetDirectoryName(fn))返回文件路径的文件夹名称。