C# 获取目录时System.UnauthorizedAccessException

C# 获取目录时System.UnauthorizedAccessException,c#,console-application,.net,C#,Console Application,.net,我对C#很陌生,所以我一直在做一个小宠物项目 我创建了一个小程序,用于比较目录大小和给定大小。如果该目录等于或大于该目录,则会记录该目录的路径 long size = Convert.ToInt32(Size) * 1024 * 1024; string[] directories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories); //the error occurs on this line Array.So

我对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:\的垃圾桶时会发生错误,但即使它跳过此特定位置,错误仍会返回到另一个无法访问的位置


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

递归是你在这里的朋友。根据需要在循环中添加错误处理。试试这个:

    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;
    }

有几件事需要记住:1)你将无法访问某些操作系统目录,这些目录只允许操作系统本身访问,而不允许任何其他用户帐户访问,因此这可能是原因。2) 如果您正在查看网络目录,您的帐户可能没有访问它们的权限,这也是原因。3) 如果您在ASP.NET/MVC中使用此代码,那么它将在应用程序池帐户下运行,可能是因为目录未按允许添加用户帐户。您也没有在代码中指定起始路径。请看:@Ahmedilyas我已经为问题添加了更多信息。我希望这更清楚一点。谢谢。那么,你能告诉我们当这个文件夹在目录中迭代时,它抛出了什么错误吗?同样,正如我所说,有些文件夹即使作为管理员也无法访问,因为它们是OS文件夹/文件,或者通过另一个程序,在该程序中,它被另一个用户帐户独占锁定,无论您是管理员还是管理员not@Ahmedilyas在这种情况下,它是D:\驱动器的垃圾桶。我听说过仅限操作系统的文件夹。未经授权的异常确实阻止了它们。但这就是为什么我写了那部分关于
SearchOption.AllDirectories
。因为如果我删除它,代码就会工作。但是如果我删除它,它看起来就没有任何子目录了。我不太喜欢外部数据。因为所有的数据都来自参数,在主空间中。这只是一个粗略的例子,说明了如何递归地检查目录大小。使用你喜欢的方法。我一直在测试你的代码,看起来很有效。或多或少现在唯一的问题是它不写路径。你对这行的位置有什么建议吗?请注意,我在dir后面加上了.FullName,使它工作得很好。