2015-01-24 2 views
0

У меня есть каталог, который должен иметь 21 файл в диапазоне от 0 до 20. Файл заканчивается символом подчеркивания и числом от 0 до 20 (может быть в формате _01 или _1) с соглашениями об именах как показано ниже:Найдите недостающие имена файлов в каталоге с помощью C#

DirectoryName_00.txt, DirectoryName_01.txt,..., DirectoryName_20.txt Или DirectoryName_0.txt, DirectoryName_1.txt,..., DirectoryName_20.txt

Я хотел выяснить, файлы, отсутствующие сейчас я использую быть низкий фрагмент кода:

for (int pageNum = 0; pageNum <= 20; pageNum++) 
{ 
    //templateFiles is list of files in that directory 
    string expectedTemplateName = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00")); 
    templateFiles.Any(file => file.Equals(expectedTemplateName, StringComparison.OrdinalIgnoreCase)); 
} 

Но с таким подходом я являюсь ограниченным искать файл в формате 00,01,02,03 ... 20 и не в состоянии искать файл в формате 0,1,2,3. ..20. Есть ли короткий подход, с помощью которого я могу искать файлы в обоих форматах (возможно, с помощью RegEx).

ответ

2

Делают это дважды,

for (int pageNum = 0; pageNum <= 20; pageNum++) 
{ 
    //templateFiles is list of files in that directory 
    string expectedTemplateName1 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString()); 
    string expectedTemplateName2 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00")); 
    templateFiles.Any(file => 
     (file.Equals(expectedTemplateName1, StringComparison.OrdinalIgnoreCase) || 
     file.Equals(expectedTemplateName2, StringComparison.OrdinalIgnoreCase))); 
} 
+0

Да, это можно сделать, но я искал короткий подход. С RegEx я могу получить файл, который заканчивается с _0 до _ 20, но не смог найти недостающие файлы между 0-20 – Sameer

+0

Regex может помочь вам найти «Матчи», но не может сделать ваш код короче. – kennyzx

+1

Regex может сделать ядро ​​немного короче, но это довольно неуместно, так как его труднее читать и (согласно моему тесту) выполняет намного хуже, чем простое сравнение строк. – hangy

0

что-то вроде этого:

var re = new Regex("_[\\d]."); 
var resultedFiles = templateFiles.Where(x => re.IsMatch(x)); 
2

Регулярные выражения, вероятно, не лучший инструмент в этом случае, поэтому я бы просто пойти с @ kennyzx это прямо вперед подход. Если вы отчаянно хотите использовать регулярное выражение, вы можете пойти со следующим: Но имейте в виду, что это на 800% медленнее, чем сравнение прямых строк, и не обязательно легче понять.

for (int pageNum = 0; pageNum <= 20; pageNum++) 
{ 
    var regex = new Regex(string.Format(@"^{0}_(?:{1}|{1:00})\.txt$", directoryName, pageNum), RegexOptions.IgnoreCase); 
    templateFiles.Any(file => regex.IsMatch(expectedTemplateName, StringComparison.OrdinalIgnoreCase)); 
} 
+0

Спасибо @hangy за эту ценную информацию. Я пойду с подходом кенизма – Sameer