2011-12-17 26 views
2

我正在创建一个应用程序,该应用程序在文件中发现重复。当我搜索文件,如:获取文件时出现UnauthorizedAccessException

try 
{ 
    string[] allFiles = Directory.GetFiles(
     directoryPath, "*.*", SearchOption.AllDirectories 
    ); 

    for (int i = 0; i < allFiles.Length; i++) 
    { 
     //decisions 
    } 
} 

catch (UnauthorizedAccessException ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

它说

访问路径 'C:\ $ RECYCLE.BIN .......' 被拒绝。

我想如果一个文件夹不可访问,然后移动到下一个,但程序的执行停止在Directory.GetFiles方法。

+0

我们称之为功能而不是bug。没有一个理智的用户会忍受一个僵尸程序,用于*分钟*,同时枚举c:\驱动器上的每个文件。一个TB是一个很大的数字。 – 2011-12-17 22:05:56

+0

@谁说应用程序在执行代码时运行UI? – sq33G 2011-12-17 22:22:49

回答

4

这里的一类,将工作:

public static class FileDirectorySearcher 
{ 
    public static IEnumerable<string> Search(string searchPath, string searchPattern) 
    { 
     IEnumerable<string> files = GetFileSystemEntries(searchPath, searchPattern); 

     foreach (string file in files) 
     { 
      yield return file; 
     } 

     IEnumerable<string> directories = GetDirectories(searchPath); 

     foreach (string directory in directories) 
     { 
      files = Search(directory, searchPattern); 

      foreach (string file in files) 
      { 
       yield return file; 
      } 
     } 
    } 

    private static IEnumerable<string> GetDirectories(string directory) 
    { 
     IEnumerable<string> subDirectories = null; 
     try 
     { 
      subDirectories = Directory.EnumerateDirectories(directory, "*.*", SearchOption.TopDirectoryOnly); 
     } 
     catch (UnauthorizedAccessException) 
     { 
     } 

     if (subDirectories != null) 
     { 
      foreach (string subDirectory in subDirectories) 
      { 
       yield return subDirectory; 
      } 
     } 
    } 

    private static IEnumerable<string> GetFileSystemEntries(string directory, string searchPattern) 
    { 
     IEnumerable<string> files = null; 
     try 
     { 
      files = Directory.EnumerateFileSystemEntries(directory, searchPattern, SearchOption.TopDirectoryOnly); 
     } 
     catch (UnauthorizedAccessException) 
     { 
     } 

     if (files != null) 
     { 
      foreach (string file in files) 
      { 
       yield return file; 
      } 
     } 
    } 
} 

您可以使用它像这样:

IEnumerable<string> filesOrDirectories = FileDirectorySearcher.Search(@"C:\", "*.txt"); 

foreach (string fileOrDirectory in filesOrDirectories) 
{ 
    // Do something here. 
} 

这是递归的,但使用屈服的,给它一个低内存占用(下10KB在我的测试中)。如果您只需要匹配模式而不是目录的文件,只需将EnumerateFileSystemEntries替换为EnumerateFiles即可。

+0

该代码有一个主要的错误...因为EnumerateDirectories将返回一个IEnumerable,然后当您遍历IEnumerable时,您将得到UnauthorizedAccessException ..我更新了上面的代码。 – 2012-06-12 16:53:44

+0

嗨@BlakeNiemyjski,我一直在看代码,但一直无法重现你说你的编辑地址的问题。你能告诉我重现它的具体步骤吗? – JamieSee 2012-06-12 22:45:05

+0

您的代码正在拾取系统文件夹,如回收站。我以管理员身份运行代码并将其指向您的Windows驱动器 – 2012-07-16 18:26:38

相关问题