获取文件时出现UnauthorizedAccessException

我正在创建一个在文件中找到重复的应用程序。 当我搜索文件时:

try { string[] allFiles = Directory.GetFiles( directoryPath, "*.*", SearchOption.AllDirectories ); for (int i = 0; i < allFiles.Length; i++) { //decisions } } catch (UnauthorizedAccessException ex) { MessageBox.Show(ex.Message); } 

它说

访问路径’C:\ $ Recycle.Bin …….’被拒绝。

我想如果一个文件夹不可访问然后移动到下一个,但程序的执行停止在Directory.GetFiles方法。

这是一个可以工作的课程:

 public static class FileDirectorySearcher { public static IEnumerable Search(string searchPath, string searchPattern) { IEnumerable files = GetFileSystemEntries(searchPath, searchPattern); foreach (string file in files) { yield return file; } IEnumerable directories = GetDirectories(searchPath); foreach (string directory in directories) { files = Search(directory, searchPattern); foreach (string file in files) { yield return file; } } } private static IEnumerable GetDirectories(string directory) { IEnumerable subDirectories = null; try { subDirectories = Directory.EnumerateDirectories(directory, "*.*", SearchOption.TopDirectoryOnly); } catch (UnauthorizedAccessException) { } if (subDirectories != null) { foreach (string subDirectory in subDirectories) { yield return subDirectory; } } } private static IEnumerable GetFileSystemEntries(string directory, string searchPattern) { IEnumerable files = null; try { files = Directory.EnumerateFileSystemEntries(directory, searchPattern, SearchOption.TopDirectoryOnly); } catch (UnauthorizedAccessException) { } if (files != null) { foreach (string file in files) { yield return file; } } } } 

您可以像这样使用它:

 IEnumerable filesOrDirectories = FileDirectorySearcher.Search(@"C:\", "*.txt"); foreach (string fileOrDirectory in filesOrDirectories) { // Do something here. } 

它是递归的,但使用yield会使内存占用空间很小(在我的测试中不到10KB)。 如果只想要与模式匹配的文件而不是目录,只需将EnumerateFileSystemEntries替换为EnumerateFiles