【问题标题】:Directory.EnumerateFiles: How to specify a range or a list as searchPattern [duplicate]Directory.EnumerateFiles:如何将范围或列表指定为 searchPattern [重复]
【发布时间】:2013-07-29 17:54:14
【问题描述】:

给定这样的文件列表:

file_1.txt
file_2.txt
file_3.txt
file_4.txt
file_5.txt
file_6.txt

如何调用Directory.EnumerateFiles() 来获取文件范围或文件列表?例如

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt", SearchOption.TopDirectoryOnly)

将返回上述所有六个文件,到目前为止一切顺利。但是如果我想获得一个范围(即从file_3.txtfile_5.txt)或一个列表(即file_1.txtfile_4.txtfile_6.txt)怎么办?

我正在寻找的是这样的(下面的代码不起作用......只是给你一个想法):

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_{3-5}.txt", SearchOption.TopDirectoryOnly)

获取一系列文件

file_3.txt
file_4.txt
file_5.txt

...然后

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_{1,4,6}.txt", SearchOption.TopDirectoryOnly)

获取准确的文件列表

file_1.txt
file_4.txt
file_6.txt

任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    以 DavidH 的回答为基础。

    使用 LINQ 和 System.Text.Regular 表达式获取文件列表:

    IEnumerable<string> files1to3 =  Directory.EnumerateFiles(@"C:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => Regex.IsMatch(f, "File[1-3].txt"));
    IEnumerable<string> files4to6 = Directory.EnumerateFiles(@"C:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => Regex.IsMatch(f, "File[4,5,6].txt"));
    

    回应@j3d:

    IEnumerable<string> files150to200 = Directory.EnumerateFiles(@"C:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => Convert.ToInt32(Regex.Match(f, @"\d+").Value) >= 150 && Convert.ToInt32(Regex.Match(f, @"\d+").Value) <= 200);
    

    对于文件编号列表,您可以执行以下操作:

    System.Collections.ArrayList searchArrayList = new System.Collections.ArrayList();
    searchArrayList.Add(new int[] { 1, 125, 1554 });
    
    foreach (int[] i in searchArrayList) {
        IEnumerable<string> findFiles = Directory.EnumerateFiles(@"c:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => i.Contains(Convert.ToInt32(Regex.Match(f, @"\d+").Value)));
    }
    

    Resource

    【讨论】:

    • 无需调用ToList(),EnumerateFiles返回一个IEnumerable,可以和Where as is一起使用
    • 谢谢!我已删除 ToList() 调用。
    • 只是一个评论... File[1-3]\.txt 仅适用于小于 10 的数字...如果我需要匹配 File333.txt 之类的文件名怎么办?换句话说,我需要指定任何类型的范围(例如 File[150-200]\.txt)
    • @j3d 请参阅编辑。
    • 非常感谢!这有帮助 ;-)
    【解决方案2】:

    Directory.EnumerateFiles 似乎只适用于简单的通配符。但是,根据这个问题/答案(How to find files according RegEx in C#)。您可以使用 LINQ 和正则表达式匹配来进行过滤吗?

    【讨论】:

      【解决方案3】:

      将它与 LINQ 结合起来:

      Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt").Skip(2).Take(3);
      
      Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt").Where(...);
      

      【讨论】:

        猜你喜欢
        • 2013-01-20
        • 1970-01-01
        • 2019-11-04
        • 2013-11-07
        • 1970-01-01
        • 2019-12-24
        • 2016-04-07
        • 1970-01-01
        • 2012-11-24
        相关资源
        最近更新 更多