【问题标题】:Exclude results from Directory.GetFiles从 Directory.GetFiles 中排除结果
【发布时间】:2012-02-02 03:27:54
【问题描述】:

如果我想调用Directory.GetFiles 并让它返回与模式*.bin 匹配的所有文件,但我想排除与模式LOG#.bin 匹配的所有文件,其中# 是一个运行计数器长度不定。有没有办法在将搜索过滤器传递给GetFiles 的步骤中过滤掉结果,或者我必须获取结果数组然后删除我想要排除的项目?

【问题讨论】:

  • Directory.GetFiles 没有这个能力。模式参数仅指示应该包含什么。更好的选择可能是使用Directory.EnumerateFiles 并在其结果上指定Where 子句。

标签: c# .net


【解决方案1】:

您可以使用 Linq、Directory.EnumerateFiles() 和 Where() 过滤器 - 这样您只会得到您想要的文件,其余的会被过滤掉。

这样的事情应该可以工作:

Regex re = new Regex(@"^LOG\d+.bin$");
var logFiles = Directory.EnumerateFiles(somePath, "*.bin")
                        .Where(f => !re.IsMatch(Path.GetFileName(f)))
                        .ToList();

正如Directory.EnumerateFiles 指出的那样,需要.NET 4.0。还有一个更简洁的解决方案(以更多的开销为代价)使用DirectoryInfo / EnumerateFiles(),它返回一个IEnumerable<FileInfo>,这样您就可以直接访问文件名和扩展名而无需进一步解析。

【讨论】:

  • 如果你需要使用 .Net tom-shelton.net/index.php/2010/01/02/…
  • 谢谢我知道.Where 子句,我只是想知道是否可以在没有第二个过滤器的情况下完成。我对您的代码做了一个小改动,因为它匹配了我希望它匹配的 ThisIsNotALOG0.bin 之类的东西。谢谢。
【解决方案2】:

有一个使用Linq的解决方案:

using System;
using System.IO;
using System.Linq;

namespace getfilesFilter
{
    class Program
    {
        static void Main(string[] args)
        {
            var files = Directory.GetFiles(@"C:\temp", "*.bin").Select(p => Path.GetFileName(p)).Where(p => p.StartsWith("LOG"));
            foreach (var file in files)
            {
                Console.WriteLine(file);
            }
            Console.ReadLine();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2012-04-28
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多