我有一个简单的方法来计算目录的大小及其中的所有文件。这是代码:
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。全都一样。为什么呢?
答案 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;
}
}
在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”。您无法访问代码中的“程序”,而是“程序文件”