1

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

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。都一样。为什么?

4

3 回答 3

3

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

于 2012-12-28T22:06:18.013 回答
2

您的代码失败C:\Documents and Settings,现在是指向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;
    }
}

连接点(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) 设置为拒绝所有人的读取访问权限。调用特定路径的应用程序如果具有所需的权限,则可以遍历这些连接点。但是,尝试枚举连接点的内容将导致失败

于 2012-12-28T22:25:16.183 回答
0

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

于 2012-12-28T22:03:22.847 回答