Общий подход обрисован в общих чертах @Slaks - так как вам нужно поддерживать набор различных расширений файлов, и вы хотите получать статистику, возможно, было бы лучше написать собственный метод, так что вам нужно только пройтись по дереву каталоговодин раз.
Вместо использования рекурсивных вызовов вы можете просто использовать Stack для выражения рекурсии, ниже только пример, который возвращает список подходящих файлов на основе перечисления расширений - вы можете легко изменить это для своего сценария:
public static List<string> DirSearch(string startDirectory, IEnumerable<string> extensions)
{
Stack<string> directoryStack = new Stack<string>();
List<string> files = new List<string>();
directoryStack.Push(startDirectory);
while (directoryStack.Count > 0)
{
string currentDirectory = directoryStack.Pop();
DirectoryInfo di = new DirectoryInfo(currentDirectory);
files.AddRange(di.EnumerateFiles()
.Where(f => extensions.Contains(f.Extension))
.Select(f => f.FullName));
foreach (string directory in Directory.GetDirectories(currentDirectory))
directoryStack.Push(directory);
}
return files;
}