2013-06-03 57 views
1

我编写了一个调用方法DirectoryInfo.GetFiles()的程序(在WINDOWS SEVEN中),并且在文件夹“文档和设置”中我有UnauthorizedAccess异常。未经授权的访问异常DirectoryInfo.getfiles()方法

我试过很多可能的解决方案,如:

创建清单与

`<requestedExecutionLevel level="highestAvailable" uiAccess="false" />` 

,并与该

DirectorySecurity dSecurity = Directory.GetAccessControl(dir.FullName); 
dSecurity.AddAccessRule(new FileSystemAccessRule("Luca", FileSystemRights.FullControl, AccessControlType.Allow)); 

Directory.SetAccessControl(dir.FullName, dSecurity); 

我惹毛了,试图找到一个解决方案!

你能帮我吗?

+0

右键单击并以管理员身份运行您根据应用 – mojtaba

+0

[这](HTTP:// MSDN .microsoft.com/en-us/library/system.io.fileinfo.aspx)没有'FileInfo.GetFiles()'方法。 – Kcvin

+1

哈哈......很确定他的意思是'DirectoryInfo.GetFiles()'。 @ user2424742,你在使用递归的'AllDirectories'选项吗? –

回答

0

最好的办法可能是在呼叫周围放一个try/catch块,并忽略任何你无权访问的目录。也许不是最好的解决方案,但它至少可以让你的方法获得你有权访问的所有目录。就像这样:

try 
{ 
    directory.GetFiles(); 
} 
catch (UnauthorizedAccessException) 
{ 
    string logMsg = string.Format("Unable to access directory {0}", directory.FullName); 
    //Handle any desired logging here 
} 
+1

从长远来看,这最终不起作用。它将无法返回您有权访问的文件夹/文件的完整枚举。结果列表将仅包含在遇到异常之前检查的文件/文件夹。 –

2

首先,你应该使用DirectoryInfo.EnumerateFiles(...)而不是GetFiles(...)。 EnumerateFiles(...)让你无需得到整个列表,直到你真正需要。

我遇到了这个问题,后来发现我最终需要实现一个替代IEnumerable,以便能够完成对我只能选择访问的文件夹的枚举。

您可以在以下主题中看到我的研究结果。 DirectoryInfo.EnumerateFiles(...) causes UnauthorizedAccessException (and other exceptions)

1

只是一个快速复制粘贴,因为我只是有同样的问题。 根据您的需要调整代码(因为我计算大小,统计所有文件并“保存”所有要复制到列表中的文件)。 后你有你的列表中的所有文件就可以开始将它们复制或你想要做的文件什么都:

private double CalculateSize(string sourcePath, Progress state, List<FileInfo> filesToCopy) 
    { 
     int _fileCount = 0; 
     DirectoryInfo sourceDirectory = new DirectoryInfo(sourcePath); 

     FileInfo[] files = null; 
     try 
     { 
      files = sourceDirectory.GetFiles(); 
     } 
     catch(UnauthorizedAccessException ex) 
     { 
      // DO SOME LOGGING-MAGIC IN HERE... 
     } 

     if (files != null) 
     { 
      foreach (FileInfo file in files) 
      { 
       fullSizeToCopy += file.Length; 
       filesToCopy.Add(file); 
       _fileCount++; 
      } 
     } 

     DirectoryInfo[] directories = null; 
     try 
     { 
      directories = sourceDirectory.GetDirectories(); 
     } 
     catch(UnauthorizedAccessException ex) 
     { 
      // Do more logging Magic in here... 
     } 
     if (directories != null) 
     foreach (DirectoryInfo direcotry in directories) 
     { 
      CalculateSize(direcotry.FullName, state, filesToCopy); 
     } 
     state.FileCount = _fileCount; 

     return fullSizeToCopy; 
    }