2014-01-29 1 views
1

Мне нужно загрузить файлы из каталога с помощью опции поиска. Я создал два шаблона поиска, сначала я должен найти файлы, начинающиеся с «Клиент» и без расширения «_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)); 

ответ

1

Почему даже беспокоиться о регулярном выражении?

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

Regex, потому что у меня есть маски свойство в объектах – zrabzdn

+0

@zrabzdn: Ни один из ваших требований не требуют регулярных выражений –

+0

Ламу ... я отправил тот же самый точный ответ 7 минут раньше :) –

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.

Далее вы усложнять вещи. Никакое регулярное выражение не требуется (или гарантируется).

У вас есть два случая; файлы, которые начинаются с «Клиент» и заканчиваются на «_delete», а те, которые начинаются с «Клиент», и нет. «Клиент» является общим для обоих, поэтому просто возьмите все файлы, которые начинаются с клиента, затем найдите те, которые заканчиваются на «_delete», а остальные - те, которые не заканчиваются на «_delete».

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

EDIT: Я просто заметил, что вы ошибочно говорят, что расширение «_delete», когда на самом деле, это просто конец имени файла. Таким образом ...

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