VB.NET实现目录路径List(Of String)转_Folder层级结构
实现思路
- 先对原始路径做预处理:过滤空值、去除路径末尾多余的反斜杠、去重、按路径长度从小到大排序,保证父目录一定会在子目录之前被处理,避免挂载子节点时找不到父级。
- 每个路径按
\拆分成独立的路径段,第一段为盘符根节点,先维护根节点集合,不存在对应盘符就新建实例。 - 从根节点开始逐段遍历路径,每到一个层级就检查当前文件夹的
SubFolders集合中是否存在同名子文件夹,不存在则新建,存在则直接进入该子文件夹继续处理下一段,直到整条路径的所有段都挂载完成。 - 路径名称比较统一使用忽略大小写规则,适配Windows文件系统路径不区分大小写的特性,避免因大小写差异重复创建文件夹。
实现代码
Public Class _Folder Public Property Name As String Public ReadOnly Property SubFolders As List(Of _Folder) = New List(Of _Folder)() End Class ''' <summary> ''' 平铺路径列表转层级文件夹结构 ''' </summary> ''' <param name="rawPaths">原始目录路径集合</param> ''' <returns>根层级文件夹集合(对应各盘符节点)</returns> Public Function BuildFolderHierarchy(rawPaths As List(Of String)) As List(Of _Folder) ' 路径预处理 Dim cleanedPaths = rawPaths. Where(Function(p) Not String.IsNullOrWhiteSpace(p)). Select(Function(p) p.Trim().TrimEnd("\"c)). Distinct(StringComparer.OrdinalIgnoreCase). OrderBy(Function(p) p.Length). ToList() Dim rootFolders As New List(Of _Folder)() For Each path In cleanedPaths ' 拆分路径段,自动过滤多余空段 Dim pathSegments = path.Split({"\"c}, StringSplitOptions.RemoveEmptyEntries) If pathSegments.Length = 0 Then Continue For ' 处理盘符根节点 Dim driveName = pathSegments(0) Dim currentRoot = rootFolders.FirstOrDefault(Function(f) f.Name.Equals(driveName, StringComparison.OrdinalIgnoreCase)) If currentRoot Is Nothing Then currentRoot = New _Folder With {.Name = driveName} rootFolders.Add(currentRoot) End If ' 逐段挂载子文件夹 Dim currentFolder As _Folder = currentRoot For i = 1 To pathSegments.Length - 1 Dim segName = pathSegments(i) Dim nextFolder = currentFolder.SubFolders.FirstOrDefault(Function(f) f.Name.Equals(segName, StringComparison.OrdinalIgnoreCase)) If nextFolder Is Nothing Then nextFolder = New _Folder With {.Name = segName} currentFolder.SubFolders.Add(nextFolder) End If currentFolder = nextFolder Next Next Return rootFolders End Function
调用示例
' 传入自定义路径集合即可 Dim rawPathList As New List(Of String) From { "c:\temp\in", "c:\temp\in - Kopie", "c:\temp\in - Kopie\1", "c:\temp\in - Kopie\1\yyy", "c:\temp\in - Kopie\1\yyy\yyyyy", "c:\temp\in - Kopie\2", "c:\temp\in2", "c:\temp\ipadb", "c:\temp\out", "c:\temp\out2", "c:\temp\Processes2", "c:\temp\Processes2\Kassenbelege", "c:\temp\Processes2\Kassenbelege\images", "c:\temp\Processes2\Posteingang", "c:\temp\Processes2\Posteingang\images", "c:\temp\Processes2\Rechnungen", "c:\temp\Processes2\Rechnungen\images", "c:\temp\Processes2\Rechnungen\images\backup", "c:\temp\test" } Dim hierarchyResult = BuildFolderHierarchy(rawPathList)
说明:该实现为迭代逻辑,无递归栈溢出风险,处理数千条路径也能稳定运行;预处理阶段自动兼容路径末尾带反斜杠、多反斜杠、重复路径、空路径等异常输入,不需要额外做输入校验。
内容的提问来源于stack exchange,提问作者MUnna
相关产品推荐
相关产品推荐

