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确定了另一个根本原因。