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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:42:23