Вам придется пропустить каталоги, которые вы не можете прочитать (при условии, что вы не можете запустить свою программу под учетной записью System или другой учетной записью с правами на чтение всех каталогов).
Вы должны бытьосторожно, потому что вы не можете использовать yield
внутри try/catch
.Вот один из подходов:
public static IEnumerable<string> EnumFilesRecursively(string rootDirectory)
{
// Helper method to call GetEnumerator(), returning null on exception.
IEnumerator<T> getEnumerator<T>(Func<IEnumerable<T>> getEnumerable)
{
try { return getEnumerable().GetEnumerator(); }
catch { return null; }
}
// Enumerate all files in the current root directory.
using (var enumerator = getEnumerator(() => Directory.EnumerateFiles(rootDirectory)))
{
if (enumerator != null)
while (enumerator.MoveNext())
yield return enumerator.Current;
}
// Recursively enumerate all subdirectories.
using (var enumerator = getEnumerator(() => Directory.EnumerateDirectories(rootDirectory)))
{
if (enumerator != null)
while (enumerator.MoveNext())
foreach (var file in EnumFilesRecursively(enumerator.Current))
yield return file;
}
}
Чтобы проверить это:
public static void Main(string[] args)
{
foreach (var file in EnumFilesRecursively(@"C:\Program Files\"))
{
Console.WriteLine(file);
}
}