Создать структуру каталогов из TreeNode с токенами - PullRequest
0 голосов
/ 14 января 2019

рекурсия болит у меня в голове ..

Я пытаюсь рекурсивно создавать каталоги с помощью древовидной структуры, но также с использованием токенизированных переменных. Например:

enter image description here

Любой узел в квадратных скобках будет представлять массив строк, которые передаются в метод. В приведенном выше примере, скажем, мы ввели List(Of String) from {"SNES","N64"} для [SystemName] в процедуру, мы бы получили каталоги (не исчерпывающе):

C:\Database\Systems\SNES\Game-Images
C:\Database\Systems\SNES\Game-Vidoes
etc..
C:\Database\Systems\N64\Game-Images
C:\Database\Systems\N64\Game-Vidoes

В продолжение примера, если бы мы также вводили List(Of String) from {"Box","Screenshot"} для [System-Image-Type] в процедуру, мы также получили бы

C:\Database\Systems\SNES\System-Images\Box
C:\Database\Systems\SNES\System-Images\Screenshot
etc..
C:\Database\Systems\N64\System-Images\Box
C:\Database\Systems\N64\System-Images\Screenshot

Полагаю, это требует рекурсии. Я попробовал это с каким-то неаккуратным кодом (со списком, жестко запрограммированным в тесте), но застрял. Код:

Public Sub BuildAssetFoldersStructure()
    Debug.WriteLine(vbCr & "Creating Assets folders from DevForm.AssetsFolderStructure")
    Dim n As TreeNode
    For Each n In DevForm.AssetsFolderStructure.Nodes
        PrintRecursive(n)
    Next

End Sub


Private Sub PrintRecursive(ByVal n As TreeNode)

    Dim dpath As String = Nothing
    Dim finalNodeText As String = Nothing

    If n.Text.Substring(0, 1) = "[" Then

        For Each col In New List(Of String) From {"red", "white", "blue"}

            dpath = Path.Combine(My.Settings.fileAssetsPath, n.Parent.FullPath & "\" & col)
            System.Diagnostics.Debug.WriteLine("Creating: " & dpath)
            Directory.CreateDirectory(dpath)
        Next

    Else
        dpath = Path.Combine(My.Settings.fileAssetsPath, n.FullPath)
        System.Diagnostics.Debug.WriteLine("Creating: " & dpath)
        Directory.CreateDirectory(dpath)
    End If

    Dim aNode As TreeNode
    For Each aNode In n.Nodes
        PrintRecursive(aNode)
    Next

End Sub

И вывод:

Creating Assets folders from DevForm.AssetsFolderStructure
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\red
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\white
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\blue
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\Game-Images
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\Game-Videos
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\Game-Music
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\System-Images
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\System-Images\red
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\System-Images\white
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\System-Images\blue
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Systems\[SystemName]\System-Videos
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\Database\Emulators
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\User
Creating: C:\Users\Steve\Documents\Visual Studio 2017\Projects\GameInfoz\GameInfoz\bin\Debug\Assets\User\Avatars

Замена токенов работает для детей, но не для родительских узлов. У меня подлое предчувствие, что за углом действительно элегантное решение, но оно кажется мне не по зубам!

Буду благодарен за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...