Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Directory.EnumerateFiles方法:如何枚举指定子目录中的文件?_C#_Linq - Fatal编程技术网

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

C# Directory.EnumerateFiles方法:如何枚举指定子目录中的文件?,c#,linq,C#,Linq,采用以下目录结构。“C:\Genre”和“Genre”目录有几个子目录:“Rock”、“Pop”、“Metal”、“Jazz” 如何调整以下语句以仅在“Rock”和“Metal”子目录中搜索 var myFiles = Directory. EnumerateFiles("C:\Genre", "*", SearchOption.AllDirectories). Where(s => s.EndsWith(".jpg") || s.EndsWith(".gif")); 在

采用以下目录结构。“C:\Genre”和“Genre”目录有几个子目录:“Rock”、“Pop”、“Metal”、“Jazz”

如何调整以下语句以仅在“Rock”和“Metal”子目录中搜索

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

在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"));

在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"));

对于扩展和
路径
-类,可以使用两个数组:

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))
返回文件路径的文件夹名。

您可以使用两个数组作为扩展名和
路径
-类:

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))
返回文件路径的文件夹名。

我认为最简单的方法是搜索所需的每个目录,然后将它们添加到
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);

现在,如果你想要一个通用的方法来实现这一点,那将是一个不同的故事,一个更复杂的故事:)

我想说一个干净的方法是搜索你想要的每个目录,然后将它们添加到
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);

现在,如果你想要一个通用的方法,那将是一个不同的故事,更复杂的一个:)

< P>请考虑一些类似这样的实现:

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;
    }
}
公共静态类程序
{
公共静态void Main()
{
var directoryPaths=新列表
{
@“C:\root\path\u 1”,
@“C:\root\path\u 2”,
@“C:\root\path\u 3”
// …
};
var searchPatterns=新列表
{
“*.jpg”,
“*.gif”
};
var filepath=directorypath
.SelectMany(directoryPath=>
枚举文件(directoryPath、searchPatterns、SearchOption.AllDirectories))
托利斯先生()
.AsReadOnly();
// …
}
私有静态IEnumerable枚举文件(
字符串路径,
i数不清的搜索模式,
搜索选项(搜索选项)
{
var filepath=searchPatterns.SelectMany(
searchPattern=>Directory.EnumerateFiles(路径、searchPattern、searchOption));
返回文件路径;
}
}

<代码> < P>请考虑一些类似这样的实现:

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;
    }
}
公共静态类程序
{
公共静态void Main()
{
var directoryPaths=新列表
{
@“C:\root\path\u 1”,
@“C:\root\path\u 2”,
@“C:\root\path\u 3”
// …
};
var searchPatterns=新列表
{
“*.jpg”,
“*.gif”
};
var filepath=directorypath
.SelectMany(directoryPath=>
枚举文件(directoryPath、searchPatterns、SearchOption.AllDirectories))
托利斯先生()
.AsReadOnly();
// …
}
私有静态IEnumerable枚举文件(
字符串路径,
i数不清的搜索模式,
搜索选项(搜索选项)
{
var filepath=searchPatterns.SelectMany(
searchPattern=>Directory.EnumerateFiles(路径、searchPattern、searchOption));
返回文件路径;
}
}


在C:\Genre\Rock和C:\Genre\Metal中搜索并合并结果?虽然我不确定gifs&&jpgs是否适用于音乐;)@Icepickle也许OP正在寻找专辑艺术和/或封面!:-)由于搜索模式不允许使用正则表达式或任何其他奇特的东西,您只能进行两次搜索或使用where条件,如
(s=>(s.ToLower().Contains(“rock”)| | s.ToLower().Contains(“metal”)和&(s.EndsWith(.jpg”)| s.EndsWith(.gif”)
。好东西!为我辩护,我确实选择了rock和metal!:)我总是在寻找一些本质上通用的东西。我可能会从配置文件中获取一个可以解析的搜索字符串,并将其处理到语句中。调整where条件可能是一个选项。决定。。。谢谢相关问题:。您在C:\Genre\Rock和C:\Genre\Metal中搜索并合并结果吗?虽然我不确定gifs&&jpgs是否适用于音乐;)@Icepickle也许OP正在寻找专辑艺术和/或封面!:-)由于搜索模式不允许使用正则表达式或任何其他奇特的东西,您只能进行两次搜索或使用where条件,如
(s=>(s.ToLower().Contains(“rock”)| | s.ToLower().Contains(“metal”)和&(s.EndsWith(.jpg”)| s.EndsWith(.gif”)
。好东西!为我辩护,我确实选择了rock和metal!:)我总是在寻找一些本质上通用的东西。我可能会从配置文件中获取一个搜索字符串,并将其处理到语句中。调整where条件可能是一个选项。决定。。。谢谢相关问题:。既然您保证两个枚举数之间不会有任何重复,您可能应该使用Concat而不是Union,并避免可能的重复搜索。是的,您是对的。我就是想不起“Concat”这个名字。既然你保证两个枚举之间不会有任何重复,你可能应该使用Concat而不是Union,避免可能的重复搜索。是的,你是对的。我就是想不起“康卡特”这个名字。太棒了!我是这个解决方案的超级粉丝。。。我分别调整了我的项目。但是,我看到文件路径计数为0。感谢大家的输入!我喜欢这个解决方案。但是,我很好奇,如果我使用100k文件等,是否会遇到任何性能问题?谢谢@80sRocker,不客气!很抱歉,很难说:最好在具体环境中衡量性能。Sergey,我如何才能将没有文件扩展名的blob文件添加到searchPatterns列表中?谢谢@80sRoCK,请考虑使用<代码> * > <代码>作为搜索模式值。太棒了!我是这个解决方案的超级粉丝。。。我调整了我的项目