2010-08-02 8 views
1

J'appelle cette fonction pour charger un TreeView avec une liste des répertoires sur le disque.Un appel récursif est la corruption de mes données?

private void LoadDirectories(string currentPath, TreeNodeCollection nodes) 
{ 
    DirectoryInfo directoryInfo = new DirectoryInfo(currentPath); 
    DirectoryInfo[] directories = directoryInfo.GetDirectories(); 

    foreach (DirectoryInfo dir in directories) 
    { 
     if ((dir.Attributes & FileAttributes.System) != FileAttributes.System && 
      (dir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden) 
     { 
      TreeNode newNode = nodes.Add(dir.Name); 
      LoadDirectories(dir.FullName, newNode.Nodes); 
     } 
    } 
} 

Si je commente l'appel récursif, je reçois tous les sous-répertoires de l'arborescence. Si je ne le fais pas, je ne le fais pas. Certains répertoires sont manquants. Je ne suis pas sûr de ce qui se passe.

Aide?

Scott

Répondre

0

Cet exemple de code fonctionne très bien. Je vous recommande de l'utiliser comme point de départ.

static void Main(string[] args) 
{ 
    var n = LoadDirectory(@"E:\Share"); 
    Console.WriteLine(n.ToString()); 
    Console.ReadLine(); 
} 

private static Node LoadDirectory(string path) 
{ 
    var n = new Node() { Name = path }; 
    LoadDirectories(path, n); 
    return n; 
} 

private static void LoadDirectories(string currentPath, Node node) 
{ 
    DirectoryInfo directoryInfo = new DirectoryInfo(currentPath); 
    DirectoryInfo[] directories = directoryInfo.GetDirectories(); 

    foreach (DirectoryInfo dir in directories) 
    { 
     if ((dir.Attributes & FileAttributes.System) != FileAttributes.System && 
      (dir.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden) 
     { 
      var n = new Node() { Name = dir.Name }; 
      node.Children.Add(n); 
      LoadDirectories(dir.FullName, n); 
     } 
    } 
} 

private class Node 
{ 
    public List<Node> Children = new List<Node>(); 
    public string Name; 

    public override string ToString() 
    { 
     return ToString(1); 
    } 

    public string ToString(int depth) 
    { 
     if (Children.Count == 0) 
     { 
      return Name; 
     } 
     var sb = new StringBuilder(Name); 
     foreach (var n in Children) 
     { 
      sb.AppendLine(); 
      sb.Append("".PadLeft(depth, '\t') + n.ToString(depth + 1)); 
     } 
     return sb.ToString(); 
    } 
} 
0

Il s'avère que le problème n'était pas du tout l'appel récursif. Le problème était que l'appel GetDirectories lançait une exception AccessDenied si l'utilisateur actuel n'avait pas accès au répertoire demandé.

J'ai simplement enveloppé les appels appropriés dans un bloc try/catch et tout va bien.

Merci pour votre aide Chaos!

Questions connexes