在计算目录大小时获取UnauthorizedAccessException

时间:2012-12-28 21:58:49

标签: c# directory

我有一个简单的方法来计算目录的大小及其中的所有文件。这是代码:

using System;
using System.IO;

namespace MyProject.Libs
{
    public sealed class DirectorySize
    {
        public static long GetDirectorySize(DirectoryInfo dir)
        {
            long total = 0;

            FileInfo[] fileInfos = dir.GetFiles();
            foreach (FileInfo fileInfo in fileInfos)
            {
                total += fileInfo.Length;
            }

            DirectoryInfo[] dirInfos = dir.GetDirectories();
            foreach (DirectoryInfo dirInfo in dirInfos)
            {
                total += DirectorySize.GetDirectorySize(dirInfo);
            }

            return total;
        }
    }
}

当我在驱动器c:\上使用它时,我收到“UnauthorizedAccessException”,并显示消息“访问路径'C:\ Documents and Settings'被拒绝。”那就是:

DirectoryInfo di = new DirectoryInfo(Path.GetPathRoot(Environment.SystemDirectory));
long ds = DirectorySize.GetDirectorySize(di);

尝试以管理员身份运行Visual Studio。全都一样。为什么呢?

3 个答案:

答案 0 :(得分:3)

即使是管理员,也有权访问您无权访问的文件和文件夹。您可以做的最好的事情是添加一些异常处理,并希望您返回的信息相当完整。

答案 1 :(得分:2)

您的代码在C:\Documents and Settings上失败,现在junction point指向C:\Users。您可以使用目录的FileAttributes.ReparsePoint进行检查。

以下是带有额外异常处理的修改后的代码(对于您未获得授权的其他目录):

public sealed class DirectorySize
{
    public static long GetDirectorySize(DirectoryInfo dir)
    {
        long total = 0;
        FileAttributes attributes = File.GetAttributes(dir.FullName);
        if (!((attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint))
        {
            try{
                FileInfo[] fileInfos = dir.GetFiles();
                foreach (FileInfo fileInfo in fileInfos)
                {
                    total += fileInfo.Length;
                }

                DirectoryInfo[] dirInfos = dir.GetDirectories();
                foreach (DirectoryInfo dirInfo in dirInfos)
                {
                    total += DirectorySize.GetDirectorySize(dirInfo);
                }
            } catch (UnauthorizedAccessException)
            { 
                // log this?
            }
        }

        return total;
    }
}

Junction Points (Windows)

  

在Windows Vista和Windows Server 2008中,默认位置为   用户数据和系统数据已更改。例如,用户数据   以前存储在%SystemDrive%\ Documents and Settings中   目录现在存储在%SystemDrive%\ Users目录中。对于   向后兼容性,旧位置有连接点   指向新的位置。例如, C:\ Documents and Settings 是   现在是一个指向 C:\ Users 的交接点。备份应用程序必须   能够备份和恢复连接点。这些交界处   积分可以确定如下:他们有    FILE_ATTRIBUTE_REPARSE_POINT ,FILE_ATTRIBUTE_HIDDEN和   FILE_ATTRIBUTE_SYSTEM文件属性集。他们也有访问权限   控制列表(ACL)设置为拒绝对所有人的读取权限。应用   如果调用特定路径可以遍历这些连接点   他们拥有所需的权限。但是,试图枚举   连接点的内容将导致失败

答案 2 :(得分:0)

有些文件夹甚至管理员都无权访问它们。这大部分时间都发生在已翻译的系统中。例如,“program files”文件夹在德语中称为“program”。您无法访问代码中的“程序”,而是“程序文件”