2017-03-03 13 views
1

c:\で始まるすべてのファイルとフォルダをツリーデータ構造に展開しようとしました。 実行ごとに、私はUnAuthorizedいくつかのdirecoriesのための例外を得た。 私が見つけた唯一の解決策は、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

あなたは許可されていないために例外がたくさん減速していると思っているようです。例外はありませんが、コストはそれほど高くありません。デバッガで実行すると非常に高価ですが、そうでなければ高価です。それが1分かかる理由は、システム内のすべてのファイルを調べるためです。ファイルマスクをgetfile呼び出しに渡すほうがよいでしょう – pm100

答えて

0
  1. 私はEnumerateDirectories代わりのGetDirectoriesを使用します。多く、多くより速い。
  2. catch文の中では、例外で何かを行います。コードがそれを飲み込まないようにしてください。これは悪いプログラミングです。

私はそれにスピンを与えること自由に感じ、私のためによく働く私はしばらく前に書いた便利な小さな方法があります:

あなたのケースでは、あなたがこのようにそれを呼ぶかもしれない
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); 
関連する問題