2017-03-03 16 views
1

Ich versuche, alle meine Datei und Ordner beginnend in C: \ zu einer Baumstruktur zu extrahieren. jeden Lauf, ich habe eine Ausnahme für Unauthorized einige Verzeichnisse. Die einzige Lösung, die ich gefunden habe, um weiterzumachen, wenn Ausnahme erhalten ist Try-Catch zu verwenden, aber in diesem Fall ist die Dauer des Laufs etwa 1 min. Gibt es eine andere Lösung für die Überprüfung, wenn Sie keine Berechtigung für einen Ordner haben?UnAuthorized-Ausnahme beim Versuch, Ordnernamen zu erhalten

Ich habe auch versucht, DirectoryName.Exsists - es hat nicht funktioniert.

mein Code:

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

Pfad, den Sie an die Funktion übergeben, ist für den Benutzer der Anwendung zulässig? –

+0

Sie scheinen zu denken, dass die Ausnahmen aufgrund von Unbefugten Sie sehr verlangsamen. Nicht wahrscheinlich, obwohl Ausnahmen ein wenig kosten, sind die Kosten nicht riesig. Sie sind sehr teuer, wenn Sie im Debugger laufen, aber nicht anders. Der Grund, warum es eine Minute dauert, ist, dass Sie sich jede Datei im System ansehen. Es wäre besser, die Dateimaske an den getfile-Aufruf zu übergeben – pm100

Antwort

0
  1. würde ich EnumerateDirectories statt GetDirectories verwenden. Viel, viel schneller.
  2. In Ihrer catch-Anweisung - etwas mit Ausnahme tun. Lassen Sie den Code nicht einfach schlucken, das ist eine schlechte Programmierung.

ich eine handliche kleine Methode habe ich eine Weile zurück schrieb, die gut für mich funktioniert, können Sie es einen Spin geben:

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>(); 
    } 

Wo in Ihrem Fall, dass Sie es so nennen könnte:

var dirTree = Find<DirectoryInfo>(new DirectoryInfo("C:\\"), "*", true); 
Verwandte Themen