从Directory.GetFiles中排除结果

时间:2012-02-02 03:27:55

标签: c# .net

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

2 个答案:

答案 0 :(得分:8)

您可以使用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>,这样您就可以直接访问文件名和扩展名而无需进一步操作解析。

答案 1 :(得分: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();
        }
    }
}