Skip to content

Instantly share code, notes, and snippets.

@jaywick
Created August 31, 2014 09:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jaywick/a7a730009d57ca67b506 to your computer and use it in GitHub Desktop.
Save jaywick/a7a730009d57ca67b506 to your computer and use it in GitHub Desktop.
Safe EnumerateFiles extension for DirectoryInfo without UnauthorizedAccessException
public static IEnumerable<FileInfo> SafeEnumerateFiles(this DirectoryInfo target, string pattern = "*.*")
{
var allFiles = Enumerable.Empty<FileInfo>();
var stack = new Stack<DirectoryInfo>();
stack.Push(target);
while (stack.Any())
{
var current = stack.Pop();
var files = getFiles(current, pattern);
allFiles = allFiles.Concat(files);
foreach (var subdirectory in getSubdirectories(current))
{
stack.Push(subdirectory);
}
}
return allFiles;
}
private static IEnumerable<FileInfo> getFiles(DirectoryInfo directory, string pattern)
{
try
{
return directory.EnumerateFiles(pattern, SearchOption.TopDirectoryOnly);
}
catch (UnauthorizedAccessException)
{
return Enumerable.Empty<FileInfo>();
}
}
private static IEnumerable<DirectoryInfo> getSubdirectories(DirectoryInfo directory)
{
try
{
return directory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly);
}
catch (UnauthorizedAccessException)
{
return Enumerable.Empty<DirectoryInfo>();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment