2012-12-28 44 views
1

我有一个简单的方法来计算目录及其中的所有文件的大小。下面是代码:在计算目录大小的同时获取UnauthorizedAccessException

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和Settings’被拒绝。”那就是:

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

试图以管理员身份运行Visual Studio。全部都一样。为什么?

+0

自Vista以来,C:\ Documents and Settings文件夹被禁用以查看它。尝试使用C:\ Users代替:) –

+0

你在哪里得到异常?试图在一个try catch语句中包装DirectioryInfo? – eandersson

+0

我在'FileInfo [] fileInfos = dir.GetFiles();'行得到异常。另外,我使用'Environment.SystemDirectory'作为起点,因此我无法控制找到哪些目录。我试图使用try/catch块,但后来我得到错误的总大小。 –

回答

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; 
    } 
} 

Junction Points (Windows)

在Windows Vista和Windows Server 2008中, 默认位置用户数据和系统数据已经改变。例如, 以前存储在%SystemDrive%\ Documents and Settings 目录中的用户数据现在存储在%SystemDrive%\ Users目录中。对于 向后兼容性,旧位置具有 指向新位置的连接点。例如,C:\ Documents and Settings为 现在是一个指向C:\用户的联结点。备份应用程序必须能够备份和恢复联结点。这些结点 可以如下鉴定:他们有 FILE_ATTRIBUTE_REPARSE_POINT,FILE_ATTRIBUTE_HIDDEN和 FILE_ATTRIBUTE_SYSTEM文件属性设置。他们还将其访问 控制列表(ACL)设置为拒绝对所有人的读取访问。如果 他们具有所需的权限,那么调出特定路径的应用程序 可以遍历这些联结点。但是,尝试枚举 节点的内容将导致故障

+0

奇妙的是,这解决了这个问题。谢谢! –

0

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

+0

这是很好的信息,可以防止人们将路径硬编码到应用程序中,但在这种情况下,OP会枚举C驱动器中的所有目录,并想知道为什么有些程序引发异常。因此,它不可能是翻译错误,所以还有另一个根本原因(由evanmcdonnal识别)。 –

3

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