通过不像掩码来查找文件

时间:2014-01-29 06:17:18

标签: c# regex getfiles

我需要使用搜索选项从目录加载文件。我创建了两种搜索模式,首先我必须找到以"客户端"开头的文件。没有" _delete"扩展

第二次搜索必须找到以"客户"开头的文件。和使用扩展名" _delete"。

我实现了测试代码,但没有找到文件。

string mask_not_like = @"Client*[^_delete\s].xlsx";
string mask = "Client*_delete.xlsx";

path1 = "c:\Client_Test.xlsx";
path2 = "c:\Client_Test_delete.xlsx";

var searchPattern1 = new Regex(mask_not_like, RegexOptions.IgnoreCase);
var searchPattern2 = new Regex(mask, RegexOptions.IgnoreCase);

var files1 = Directory.GetFiles(path1).Where(f => searchPattern1.IsMatch(f));
var files2 = Directory.GetFiles(path1).Where(f => searchPattern2.IsMatch(f));

2 个答案:

答案 0 :(得分:2)

嗯,第一个问题是您将文件路径传递给需要目录的方法。

path1 = "c:\Client_Test.xlsx";
// path one is not a directory...
var files1 = Directory.GetFiles(path1).Where(f => searchPattern1.IsMatch(f));

That should throw an IOException since path1 is a file name.

接下来,你过度复杂了。不需要(或保证)正则表达式。

你有两个案例;以“Client”开头并以“_delete”结尾的文件,以及以“Client”开头但不以“Client”开头的文件。 “客户端”对于两者都是通用的,因此,只需获取以客户端开头的所有文件,然后查找以“_delete”结尾的文件,其余文件不以“_delete”结尾。

var allFiles = Directory.GetFiles(path, "Client*.xlsx");
var endInDdelete = allFiles.Where(f => Path.GetExtension(f) == "._delete");
var doNotEndInDelete = allFiles.Except(endInDelete);
编辑:我刚刚注意到你错误地说扩展名为“_delete”,而实际上,它只是文件名的结尾。所以......

var allFiles = Directory.GetFiles(path, "Client*.*");
var endInDdelete = allFiles.Where(f => Path.GetFileNameWithoutExtension(f).EndsWith("_delete");
var doNotEndInDelete = allFiles.Except(endInDelete);

答案 1 :(得分:1)

为什么甚至打扰正则表达式?

var clientFiles = Directory.GetFiles("C:\\", "Client*.xlsx");
var clientFilesWithDelete = clientFiles.Where(clientFile => clientFile.EndsWith("_delete.xlsx"));
var clientFilesWithoutDelete = clientFiles.Except(clientFilesWithDelete);