具有不同文件夹类的树视图

本文关键字:视图 文件夹 | 更新日期: 2023-09-27 18:07:07

我正试图将混合类文件夹的树视图拉在一起。根文件夹是一个类,子文件夹是另一个类,如下所示:

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

我一直在尝试结合两种不同的递归方法,以便子文件夹被检索为"SubDirectoryItems"而不是"DirectoryItem",我将节省由于缺乏澄清的代码尝试,但我想知道是否有更好的方法?

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

}

具有不同文件夹类的树视图

我能算出来。我创建了第一个列表TopDirectoryOnly,然后通过第二个列表AllDirectories拉入其余的项目。下面的代码可能会对其他初学者(像我一样)有所帮助:

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