2016-09-15 5 views
0

J'essaie de rassembler une arborescence avec des dossiers de classes mixtes. Les dossiers racine sont une classe et les sous-dossiers sont une autre, comme celui-ci:Treeview avec différentes classes de dossiers

Root Folder #1 <-- DirectoryItem class 
--Sub Folder <-- SubDirectoryItem class 
----file  <-- FileItem class 
Root Folder #2 <-- DirectoryItem class 
--Sub Folder <-- SubDirectoryItem class 
----file  <-- FileItem class 

J'ai tenté de combiner deux méthodes différentes récursives de sorte que les sous-dossiers sont récupérés comme « SubDirectoryItems » au lieu de « DirectoryItem » Je vais épargner cette tentative de code en raison du manque de précision, mais je me demande s'il y a une meilleure approche?

class ItemProvider 
{ 
    public List<Item> GetItems(string path, SearchOption searchOption) 
    { 
     var items = new List<Item>(); 
     var dirInfo = new DirectoryInfo(path); 

     foreach (var directory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)) 
     { 
      var item = new DirectoryItem 
      { 
       Name = directory.Name, 
       Path = directory.FullName, 
       Items = GetItems(directory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     foreach (var subdirectory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)) 
     { 
      var item = new SubDirectoryItem() 
      { 
       Name = subdirectory.Name, 
       Path = subdirectory.FullName, 
       Items = GetItems(subdirectory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     foreach (var file in dirInfo.GetFiles()) 
     { 
      var item = new FileItem 
      { 
       Name = file.Name, 
       Path = file.FullName 
      }; 

      items.Add(item); 
     }  

     return items; 
    } 

} 

}

+0

Je suis confus ici. Qu'est-ce que vous cherchez exactement? Supposez-vous qu'il n'y aura qu'un sous-dossier (niveau comme aucun autre dossier dans un sous-dossier) à un moment donné? Essentiellement; sous-dossier est également un élément de répertoire. – A3006

+0

Non, je veux faire tous les dossiers de niveau supérieur dans (chemin) un type de classe de répertoire. Tout ce qui est en dessous doit être soit un fichier, soit un type de classe de sous-dossier, peu importe la profondeur des niveaux d'arborescence. Sur ma vue arborescente, les répertoires de premier niveau vont avoir des boutons et toutes sortes de choses et je pense que ce sera une façon plus simple d'accomplir que de devoir le différencier dans xaml avec des déclencheurs de données et des ivalueconverters. – ctalley5

Répondre

0

j'ai pu comprendre. J'ai fait la première liste TopDirectoryOnly puis ai tiré dans le reste des articles via une deuxième liste pour AllDirectories. Voici le code dans le cas où il aide les autres débutants (comme moi):

class ItemProvider 
{ 
    public List<Item> GetItems(string path, SearchOption searchOption) 
    { 
     var items = new List<Item>(); 
     var dirInfo = new DirectoryInfo(path); 

     foreach (var directory in dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly)) 
     { 
      var item = new DirectoryItem 
      { 
       Name = directory.Name, 
       Path = directory.FullName, 
       Items = GetSubItems(directory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     return items; 
    } 

    public List<Item> GetSubItems(string path, SearchOption searchOption) 
    { 
     var items = new List<Item>(); 
     var dirInfo = new DirectoryInfo(path); 


     foreach (var subdirectory in dirInfo.GetDirectories("*.*", SearchOption.AllDirectories)) 
     { 
      var item = new SubDirectoryItem() 
      { 
       Name = subdirectory.Name, 
       Path = subdirectory.FullName, 
       Items = GetSubItems(subdirectory.FullName, SearchOption.AllDirectories) 
      }; 

      items.Add(item); 
     } 

     foreach (var file in dirInfo.GetFiles()) 
     { 
      var item = new FileItem 
      { 
       Name = file.Name, 
       Path = file.FullName 
      }; 

      items.Add(item); 
     } 

     return items; 
    } 

}