Соответствие шаблону Directory.GetFiles () в C # - PullRequest
5 голосов
/ 12 декабря 2010

Я использую Directory.GetFiles(), чтобы вывести список файлов по заданному шаблону.Это прекрасно работает для большинства шаблонов, которые я ищу (например, zip, rar, sfv).

Так я готовлю список (более или менее).Проблема в том, что с номерами от .001 до .999, которые я хочу перечислить.

alArrayPatternText.Add("*.zip");
alArrayPatternText.Add("*.sfv");
alArrayPatternText.Add("*.r??");
alArrayPatternText.Add("*.001");
for (int i = 2; i <= 999; i++)
{
    string findNumber = String.Format("{0:000}", i);
    alArrayPatternText.Add("*." + findNumber);
}

Затем я вызываю

string[] files = Directory.GetFiles(strDirName, varPattern);

для каждого шаблона в массиве, что выглядит очень плохоИдея сделать это, так как список содержит 1002 записи, и проверка, есть ли в каталоге каждая из них, слишком трудоемка.

Был бы лучший способ сделать это?

Ответы [ 2 ]

5 голосов
/ 12 декабря 2010

Вы должны позвонить Directory.EnumerateFiles("path", "*") и затем использовать LINQ для фильтрации путей, вызвав Path.GetExtension.

Например:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
    ".zip", ".sfv"
};
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000")));
var files = Directory.EnumerateFiles("path", "*")
            .Where(p => extensions.Contains(Path.GetExtension(p))
                     || Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase));
0 голосов
/ 13 декабря 2010

Мой последний метод, основанный на SLaks, отвечает всем, кто ищет подобное решение

private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) {
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" };
     extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i)));
     return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList();
}
...