public static IEnumerable<string> GetFilesRecursive(string path, string searchPattern = null) {
var queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0) {
path = queue.Dequeue();
string[] dirs = null;
try {
dirs = Directory.GetDirectories(path);
} catch (Exception) {
// ignored
}
if (dirs != null) {
foreach (var t in from t in dirs
let attributes = new DirectoryInfo(t).Attributes
where (attributes & (FileAttributes.ReparsePoint | FileAttributes.Hidden | FileAttributes.System)) == 0
select t) {
queue.Enqueue(t);
}
}
string[] files = null;
try {
files = searchPattern == null ? Directory.GetFiles(path) : Directory.GetFiles(path, searchPattern);
} catch (Exception) {
// ignored
}
if (files == null) continue;
foreach (var t in files) {
yield return t;
}
}
}