C# 计数目录大小时获取UnauthorizedAccessException

C# 计数目录大小时获取UnauthorizedAccessException,c#,directory,C#,Directory,我有一个简单的方法来计算目录和其中所有文件的大小。代码如下: using System; using System.IO; namespace MyProject.Libs { public sealed class DirectorySize { public static long GetDirectorySize(DirectoryInfo dir) { long total = 0; Fi

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

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:\文档和设置”的访问被拒绝。即:

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

试图以管理员身份运行Visual Studio。尽管如此。为什么?

有些文件夹甚至连管理员都没有访问权限。大多数情况下,这种情况发生在已翻译的系统中。例如,“程序文件”文件夹在德语中称为“程序”。您无权访问代码中的程序,但可以访问程序文件。有些文件夹甚至连管理员都无权访问它们。大多数情况下,这种情况发生在已翻译的系统中。例如,“程序文件”文件夹在德语中称为“程序”。您无权访问代码中的程序,但可以访问程序文件

即使作为管理员,您也无权访问某些文件和文件夹。您最好添加一些异常处理,并希望返回的信息合理完整。

有些文件和文件夹即使作为管理员也无权访问。您最好添加一些异常处理,并希望返回的信息合理完整。

您的代码在C:\Documents和Settings(现在是指向C:\Users的设置)上失败。您可以使用目录的FileAttributes.repassepoint检查这一点

以下是您未经授权的其他目录的修改代码和附加异常处理:

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;
    }
}
在Windows Vista和Windows Server 2008中 用户数据和系统数据已更改。例如,用户数据 以前存储在%SystemDrive%\文档和设置中 目录现在存储在%SystemDrive%\Users目录中。对于 向后兼容性,旧位置具有 指向新的位置。例如,C:\Documents and Settings是 现在是指向C:\Users的连接点。备份应用程序必须 能够备份和恢复连接点。这些接头 这些点可以确定如下:它们具有 文件\属性\重新分析\点、文件\属性\隐藏和 文件\属性\系统文件属性集。他们也有自己的访问权限 控件列出设置为拒绝所有人的读取访问的ACL。应用 在以下情况下,调用特定路径可以遍历这些连接点 他们拥有所需的权限。然而,试图列举 连接点的内容物将导致故障

您的代码在C:\Documents和Settings上失败,该文档和设置现在是指向C:\Users的。您可以使用目录的FileAttributes.repassepoint检查这一点

以下是您未经授权的其他目录的修改代码和附加异常处理:

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;
    }
}
在Windows Vista和Windows Server 2008中 用户数据和系统数据已更改。例如,用户数据 以前存储在%SystemDrive%\文档和设置中 目录现在存储在%SystemDrive%\Users目录中。对于 向后兼容性,旧位置具有 指向新的位置。例如,C:\Documents and Settings是 现在是指向C:\Users的连接点。备份应用程序必须 能够备份和恢复连接点。这些接头 这些点可以确定如下:它们具有 文件\属性\重新分析\点、文件\属性\隐藏和 文件\属性\系统文件属性集。他们也有自己的访问权限 控件列出设置为拒绝所有人的读取访问的ACL。应用 在以下情况下,调用特定路径可以遍历这些连接点 他们拥有所需的权限。然而,试图列举 连接点的内容物将导致故障


从Vista开始,C:\Documents and Settings文件夹被禁用,无法查看。尝试改用C:\Users:从哪里获得异常?试图在try-catch语句中包装directoryInfo?我在FileInfo[]fileInfos=dir.GetFiles处得到异常;线此外,我使用Environment.SystemDirectory作为起点,因此我无法控制找到哪些目录。我试图使用try/catch块,但得到的总大小不正确。自Vista以来,C:\Documents and Settings文件夹被禁用,无法查看它。尝试改用C:\Users:从哪里获得异常?试图在try-catch语句中包装directoryInfo?我在FileInfo[]fileInfos=dir.GetFiles处得到异常;线此外,我使用Environment.SystemDirectory作为起点,因此我无法控制找到哪些目录。我试着使用try/catch块,但是我得到了错误的总大小。这是防止人们硬编码路径到
eir应用程序,但在本例中,OP正在枚举C驱动器中的所有目录,并想知道为什么有些目录会引发异常。因此,它不可能是翻译错误,因此evanmcdonnal确定了另一个根本原因。这是防止人们将路径硬编码到应用程序中的好信息,但在这种情况下,OP正在枚举C驱动器中的所有目录,并想知道为什么有些目录会引发异常。因此,这不可能是翻译错误,因此evanmcdonnal确定了另一个根本原因。