在计算目录大小时获得UnauthorizedAccessException
本文关键字:UnauthorizedAccessException 小时 计算 | 更新日期: 2023-09-27 17:49:44
我有一个简单的方法来计算目录和其中所有文件的大小。下面是代码:
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。都一样。为什么?
您的代码在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%'文档和设置目录现在存储在%SystemDrive%'Users目录中。为向后兼容性,旧的位置有连接点指向新的位置。例如,C:'Documents and Settings是现在是指向C:'Users的连接点。备份应用程序必须能够备份和恢复连接点。这些结点可以识别如下:他们有FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_HIDDEN,和FILE_ATTRIBUTE_SYSTEM文件属性设置。他们也有自己的渠道控制列表(acl)设置为,拒绝所有用户的读访问。应用程序那就召唤出一条特定的路径可以穿越这些连接点他们拥有所需的权限。但是,尝试枚举。
有些文件和文件夹即使作为管理员也没有权限访问。您所能做的最好的事情就是添加一些异常处理,并希望您返回的信息是合理完整的。
有些文件夹连管理员都没有权限访问。这种情况通常发生在翻译后的系统中。例如,"程序文件"文件夹在德语中被称为"程序"。您不能访问代码中的"program ",只能访问"program files"