获取目录时System.UnauthorizedAccessException

我是C#的新手,所以我一直在做一个小宠物项目。

我创建了一个小程序,用于比较给定大小的目录大小。 如果目录相等或更大,则它会记录该目录的路径。

long size = Convert.ToInt32(Size) * 1024 * 1024; string[] directories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories); //the error occurs on this line Array.Sort(directories); foreach (string name in directories) try { DirectoryInfo directory = new DirectoryInfo(name); long dir = directory.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length); if (dir >= ScanSize) Console.WriteLine(directory); } catch (UnauthorizedAccessException) { } 

我应该注意输入字符串和long size = Convert.ToInt32(Size)来自Main()的参数

我读过一些我不应该使用的地方

Directory.GetDirectories(ScanPath, "*", SearchOption.AllDirectories);

因为它会立刻获得所有目录。 但是如果我删除它,它只获取给定路径中的目录,没有任何子目录。 所以我被告知应用递归,但我发现这些相当困难。 我在文件上读了一些东西。 file.Attributes ,关于隐藏文件,但我不知道在哪里应用它们。

我是系统的管理员,我打算在整个数据驱动器上运行它。 d:\

但在这种情况下,当程序试图访问D:\的垃圾桶时会发生错误。但即使它跳过此特定位置,错误仍会在另一个无法访问的位置返回。

我希望这里的任何人都知道一个很好的例子,或者知道一个解释这个问题的网站。

递归是你的朋友。 在循环中根据需要添加error handling。 试试这个:

  private static long maxSize = 5 * 1024 * 1024; static void Main(string[] args) { GetDirectorySize(new DirectoryInfo(@"d:\")); } static long GetDirectorySize(DirectoryInfo dir) { long size = 0; foreach(DirectoryInfo d in dir.EnumerateDirectories("*",SearchOption.TopDirectoryOnly)) { size += GetDirectorySize(d); } size += dir.EnumerateFiles("*",SearchOption.TopDirectoryOnly).Sum(fi => fi.Length); if (size > maxSize) { Console.WriteLine("Directory: {0} Size: {1}", dir, size); } return size; }