2017-03-03 59 views
1

我嘗試從c:\開始將所有文件和文件夾提取到樹形數據結構中。每運行一次,我得到了未授權的某些直播的例外。 我發現在得到異常時繼續運行的唯一解決方案是使用try-catch,但在這種情況下,運行的持續時間約爲1分鐘。 是否有另一種解決方案來檢查是否對文件夾沒有權限?嘗試獲取文件夾名稱時發生未經授權的異常

我也嘗試使用directoryName.Exsists - 它沒有工作。

我的代碼:

private static void getAllFilesAndFoldersInPath(TreeView treeView, string path) 
    { 
     treeView.Items.Clear(); 

     var stack = new Stack<TreeViewItem>(); 
     var rootDirectory = new DirectoryInfo(path); 
     TreeViewItem node = new TreeViewItem(); 
     node.Header = rootDirectory; 
     stack.Push(node); 

     while (stack.Count > 0) 
     { 
      var currentNode = stack.Pop(); 
      var directoryInfo = (DirectoryInfo)currentNode.Header; 

      try 
      { 
       foreach (var directory in directoryInfo.GetDirectories()) 
       { 
        if (!directory.Name.StartsWith("$")) 
        { 
         TreeViewItem childDirectoryNode = new TreeViewItem(); 
         childDirectoryNode.Header = directory; 
         currentNode.Items.Add(childDirectoryNode); 
         stack.Push(childDirectoryNode); 
        } 
       } 
       foreach (var file in directoryInfo.GetFiles()) 
       { 
        if (System.IO.Path.GetFileName(file.Name).StartsWith("~$") || System.IO.Path.GetExtension(file.Name) == ".tmp") 
        { 
         continue; 
        } 
        TreeViewItem tempNode = new TreeViewItem(); 
        tempNode.Header = file; 
        currentNode.Items.Add(tempNode); 
       } 
      } 
      catch (UnauthorizedAccessException e) { } 
     } 
     treeView.Items.Add(node); 
    } 
+0

您傳遞給函數的路徑是否允許該應用程序的用戶使用? –

+0

你似乎認爲由於未經授權而導致的例外情況會讓你失望很多。不太可能,雖然例外花費了一點,但成本並不高。如果你在調試器中運行,它們是非常昂貴的,但不是這樣。它需要一分鐘的原因是因爲你看看系統中的每個文件。將文件掩碼傳遞給getfile調用會更好 – pm100

回答

0
  1. 我會用EnumerateDirectories代替GetDirectories。很多,很多更快。
  2. 在你的捕獲聲明 - 做一些例外。不要讓代碼吞下去,這是糟糕的編程。

我有一個方便的小方法,我寫了一段時間回來,對我工作得很好,隨時給它一個旋轉:

public IEnumerable<T> Find<T>(DirectoryInfo workingDirectory, 
            string searchPattern, 
            bool recursive = false) 
            where T : FileSystemInfo 
    { 
     var results = workingDirectory.EnumerateFileSystemInfos(searchPattern, 
      recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); 
     return results.OfType<T>(); 
    } 

凡在你的情況下,你可能會這樣稱呼它:

var dirTree = Find<DirectoryInfo>(new DirectoryInfo("C:\\"), "*", true); 
相關問題