【问题标题】:System.UnauthorizedAccessException when getting directories获取目录时出现 System.UnauthorizedAccessException
【发布时间】:2013-12-12 12:56:46
【问题描述】:

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

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

【问题讨论】:

  • 需要记住的几件事:1) 您将无法访问某些操作系统目录,这些目录只允许操作系统本身访问,而不允许任何其他用户帐户访问,所以这可能是原因。 2)如果您正在查看网络目录,您的帐户可能没有访问它们的权限,这也是原因。 3) 如果您在 ASP.NET/MVC 中使用此代码,则它在应用程序池帐户下运行,并且可能是目录没有添加允许的用户帐户。你也没有在你的代码中指定你开始的初始路径
  • @Ahmedilyas 我在问题中添加了更多信息。我希望这更清楚一点。
  • 谢谢。那么你能告诉我们有问题的文件夹在遍历目录时会引发什么错误吗?同样,正如我所说,有些文件夹即使作为管理员也无法访问,因为它们是操作系统文件夹/文件或通过另一个程序专门为另一个用户帐户锁定,无论您是否是管理员
  • @Ahmedilyas 在这种情况下,它是 D:\ 驱动器的垃圾桶。我听说过仅限操作系统的文件夹。未经授权的异常确实阻止了它们。但这就是为什么我写了关于SearchOption.AllDirectories 的那部分。因为如果我删除它,代码就可以工作。但是如果我删除它,它看起来就没有任何子目录。

标签: c# console-application .net


【解决方案1】:

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

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

【讨论】:

  • 我不太喜欢外部数据。因为所有的数据都来自论据,主要是空白。 With 阻止它工作。
  • 这只是一个粗略的示例,说明如何递归检查目录大小。使用你喜欢的方法。
  • 我一直在测试您的代码,似乎可以正常工作。或多或少。现在唯一的问题是它不写路径。你有什么建议吗?
  • 从头开始,我通过在 dir 后面添加 .FullName 让它工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多