Search code examples
c#wpftreeviewgetdirectories

Treeview with different folder classes


I'm trying to pull together a treeview with folders of mixed classes. The root folders are one class and subfolders are another, like this:

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

I've been attempting to combine two different recursive methods so the subfolders are retrieved as "SubDirectoryItems" instead of "DirectoryItem" I'll spare that code attempt due to lack of clarify, but I'm wondering if there's a better approach?

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

}

}


Solution

  • I was able to figure it out. I made the first list TopDirectoryOnly then pulled in the rest of the items via a 2nd list for AllDirectories. Here's the code in case it helps any other beginners (like me):

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