2012-01-30 111 views
2

所以我也跟着MS文章http://msdn.microsoft.com/en-us/library/ms171645.aspxC#樹形未經授權的例外

這是使用ListView和TreeView控件使用設計器創建一個資源管理器風格的界面。

所以一切都很好,howerver,是你將它設置爲C的根掃描所有文件夾和文件等我收到{"Access to the path '<path to file' is denied."}

VS 2010點,這個點就是這個問題。

subSubDirs = subDir.GetDirectories();

我可以把一個嘗試捕捉解決此是,howerver,拋出異常後,應用程序不會繼續。

有沒有辦法可以跳過應用程序無法訪問的目錄?

+0

請發佈您的代碼,包括您已將'try'' catch'放在哪裏。 – ChrisF 2012-01-30 21:16:32

+0

聽起來像一個權限問題給我。最有可能嘗試訪問C的根目錄:(我認爲新版本的Windows有一些保護)。正如ChrisF所說,發佈你的代碼將有助於你得到更好的答案。 – Tim 2012-01-30 21:22:55

回答

0

您可能試圖在錯誤的地方捕獲。基於在演練中的代碼,你可以把嘗試捕捉這樣的:

替換:

subSubDirs = subDir.GetDirectories(); 

與此:

try 
{ 
    subSubDirs = subDir.GetDirectories(); 
} 
catch(UnauthorizedAccessException uae) 
{ 
    //log that subDir.GetDirectories was not possible 
} 

此外,該行:

if (subSubDirs.Length != 0) 

應更改爲:

if (subSubDirs != null && subSubDirs.Length != 0) 
0

由於呼叫帳戶對System Volume Information等文件夾沒有訪問權限,因此您會得到例外。您可以通過使用Linq並跳過標記爲SystemHidden的文件夾來繞過此某些

DirectoryInfo root = new DirectoryInfo(@"C:\"); 

Func<FileSystemInfo, Boolean> predicate = dir => 
    (dir.Attributes & FileAttributes.System) != FileAttributes.System && 
    (dir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden; 

IEnumerable<FileSystemInfo> directories = root.GetDirectories().Where(predicate); 

foreach (DirectoryInfo directory in directories) { 
    try { 
     Trace.WriteLine(directory.Name); 
     DirectoryInfo[] subdirectories = directory.GetDirectories(); 
    } 
    catch (System.UnauthorizedAccessException) { 
     Trace.WriteLine("Insufficient access rights."); 
    } 
} 

Trace.WriteLine("End of application."); 

這並不是適用於所有情況的解決方案,雖然,失敗一些文件和文件夾。使用現有的API沒有簡單的解決方案;您可能需要考慮通過WMI獲取文件和目錄信息。