获取文件时出现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
。
- 如何在c#中每隔几秒调用一个特定的方法?
- 正则表达式匹配不以.ext(扩展名)结尾的字符串(1+个字符)
- 使用数字键访问JSON字段
- 带有Eval()的NavigateUrl的HyperLink。 哪里出错了?
- WebBrowser文档已完成事件C#
- 如何首先使用迁移向Entity Framework 4.3代码中的列添加描述?
- LINQ的可枚举方法是否维持元素的相对顺序?
- CheckedListBox检查列表项属性绑定到类中的字段
- 无法从’System.Data.Objects.ObjectParameter’转换为’System.Data.Entity.Core.Objects.ObjectParameter’