Я бы использовал что-то вроде следующего, нет необходимости в рекурсии, пусть BCL сделает это за вас:
// I didn't recount the parenetheses...
Regex re = new Regex("MENS|WOMENS|MENS\sDROPBOX|WOMENS\sDROPBOX)\\((((COLOR\sCHIPS)|(ALL\sMENS\sCOLORS)))|((\d{4})\\(\w+)\\(FINAL\sART|FINAL\sARTWORK)\\(\d{3})))");
var dirs = from dir in
Directory.EnumerateDirectories(dirPath, "dv_*",
SearchOption.AllDirectories)
where re.IsMatch(dir)
select dir;
Если он все еще работает 50 минут, значит, вы работаете на медленном диске, в сети или аналогичном.
РЕДАКТИРОВАТЬ: вы редактировали свой вопрос. Это ясно показывает, что вы выполняете свой код по пути UNC. Это очень медленно, если вам нужна скорость, запустите его на этом сервере.
Примечание: есть большая разница между поведением GetDirectories
(которое вы используете) и EnumerateDirectories
. Документация Microsoft говорит об этом :
Методы EnumerateDirectories и GetDirectories отличаются следующим образом: когда вы используете EnumerateDirectories, вы можете начать перечисление коллекции имен до того, как будет возвращена вся коллекция; когда вы используете GetDirectories, вы должны подождать, пока весь массив имен будет возвращен, прежде чем вы сможете получить доступ к массиву. Поэтому, когда вы работаете со многими файлами и каталогами, EnumerateDirectories могут быть более эффективными.
Что касается вашего вопроса: он будет проходить через все каталоги, к которым у него есть доступ, не позволяйте ему запускаться в каталоге, к которому у вас нет доступа (это вызовет исключение).