рекурсия болит у меня в голове ..
Я пытаюсь рекурсивно создавать каталоги с помощью древовидной структуры, но также с использованием токенизированных переменных. Например:
Любой узел в квадратных скобках будет представлять массив строк, которые передаются в метод. В приведенном выше примере, скажем, мы ввели 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
Замена токенов работает для детей, но не для родительских узлов. У меня подлое предчувствие, что за углом действительно элегантное решение, но оно кажется мне не по зубам!
Буду благодарен за любую помощь.