获取目录时System.UnauthorizedAccessException

时间:2013-12-12 12:56:46

标签: 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.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 个答案:

答案 0 :(得分:0)

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

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