1

我需要从带有搜索选项的目录中加载文件。我创建了两种搜索模式,首先我必须找到以“Client”开头且没有“_delete”扩展名的文件。

第二次搜索必须找到以“Client”开头且扩展名为“_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));
4

2 回答 2

2

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

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

那应该抛出一个IOException因为path1是一个文件名。

接下来,你把事情复杂化了。不需要(或保证)正则表达式。

你有两个案例;以“Client”开头并以“_delete”结尾的文件,以及以“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);
于 2014-01-29T06:22:57.520 回答
1

为什么还要打扰正则表达式?

var clientFiles = Directory.GetFiles("C:\\", "Client*.xlsx");
var clientFilesWithDelete = clientFiles.Where(clientFile => clientFile.EndsWith("_delete.xlsx"));
var clientFilesWithoutDelete = clientFiles.Except(clientFilesWithDelete);
于 2014-01-29T06:29:29.413 回答