You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于递归函数的C#嵌套模型实现文件资源管理器填充

多层嵌套文件资源管理器实现(ASP.NET Core MVC)

我正在开发一个支持文件、子文件夹及多层嵌套结构的文件资源管理器,为此定义了ExplorerFile文件模型和ExplorerFolder文件夹模型,其中文件夹模型包含文件列表与子文件夹列表。最初在递归遍历文件夹结构时,曾困惑于如何完整填充模型对象,以下是修正后适配ASP.NET Core MVC的可运行代码:

模型定义

public class ExplorerFile
{
    public string BoxId { get; set; }
    public string ThumbnailBase64 { get; set; }
    public DateTimeOffset? ModifiedDate { get; set; }
    public string Name { get; set; }
    public string Link { get; set; }
    public long? Size { get; set; }
}

public class ExplorerFolder
{
    public string BoxId { get; set; }
    public DateTimeOffset? ModifiedDate { get; set; }
    public string Name { get; set; }
    public string Link { get; set; }
    public long? Size { get; set; }
    public List<ExplorerFile> Files { get; set; }
    public List<ExplorerFolder> Folders { get; set; }
}

递归填充实现代码

public ExplorerFolder root_folder;

[HttpPost]
public async Task<ActionResult> BoxFolderExtract([FromForm] string BoxId)
{
    // 获取根文件夹信息
    BoxFolder folder = await boxDrive.GetFolderInfoAsync(BoxId);

    // 初始化根文件夹对象
    this.root_folder = new ExplorerFolder()
    {
        Name = folder.Name,
        ModifiedDate = folder.ModifiedAt,
        BoxId = folder.Id,
        Size = folder.Size,
        Link = Path.Combine(BoxProductionDomain, folder.Id),
        Files = new List<ExplorerFile>(),
        Folders = new List<ExplorerFolder>(),
    };

    // 递归填充根文件夹内容
    await PopulateFolderRecursively(folder, root_folder);

    return Ok(this.root_folder);
}

public async Task PopulateFolderRecursively(BoxFolder folderInfo, ExplorerFolder explorerFolder)
{
    foreach (var entry in folderInfo.ItemCollection.Entries)
    {
        try
        {
            if (entry.Type == "file")
            {
                Stream thumbnailContents = await boxDrive.GetFileThumbnailAsync(entry.Id);

                var file = new ExplorerFile()
                {
                    Name = entry.Name,
                    ModifiedDate = entry.ModifiedAt,
                    BoxId = entry.Id,
                    Size = entry.Size,
                    Link = Path.Combine(BoxProductionDomain, entry.Id),
                    ThumbnailBase64 = await ConvertStreamToBase64(thumbnailContents)
                };

                explorerFolder.Files.Add(file);
            }
            else if (entry.Type == "folder")
            {
                BoxFolder folder = await boxDrive.GetFolderInfoAsync(entry.Id);

                var subfolder = new ExplorerFolder()
                {
                    Name = folder.Name,
                    ModifiedDate = folder.ModifiedAt,
                    BoxId = folder.Id,
                    Size = folder.Size,
                    Link = Path.Combine(BoxProductionDomain, folder.Id),
                    Files = new List<ExplorerFile>(),
                    Folders = new List<ExplorerFolder>(),
                };

                await PopulateFolderRecursively(folder, subfolder);

                explorerFolder.Folders.Add(subfolder);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"{ex}");
        }
    }
}

内容的提问来源于stack exchange,提问作者Qiuzman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:20:12