2011-12-17 27 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

相關問題