基于递归函数的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
相关产品推荐
相关产品推荐

