Рекурсировать через TreeView и создавать папки - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу создать функцию для просмотра через древовидную структуру и создания каждой папки на жестком диске. Код работает нормально до сих пор. Как только он достигает конца узла, он прыгает на один уровень глубже. Но чего мне не хватает, так это строки кода для возврата в верхнюю папку и продолжения создания других папок. Это то, что я до сих пор:

    Private Sub RecurseNodes(ByVal col As TreeNodeCollection)
    For Each tn As TreeNode In col
        Console.WriteLine(drive_letter & treefix & tn.Text)
        If tn.Nodes.Count > 0 Then
            treefix = treefix & tn.Text & "\"
            RecurseNodes(tn.Nodes)
        End If
    Next tn
End Sub

Вот как выглядит мой вывод:

E:\Auftraggeber Projektname 00000
E:\Auftraggeber Projektname 00000\Export
E:\Auftraggeber Projektname 00000\Material
E:\Auftraggeber Projektname 00000\Material\Original
E:\Auftraggeber Projektname 00000\Material\Transcodiert
E:\Auftraggeber Projektname 00000\Material\Footage
E:\Auftraggeber Projektname 00000\Material\GFX
E:\Auftraggeber Projektname 00000\Material\SFX
E:\Auftraggeber Projektname 00000\Material\Sprecher
E:\Auftraggeber Projektname 00000\Material\Projekt
E:\Auftraggeber Projektname 00000\Material\Musik

и вот как на самом деле выглядит дерево: TreeView

Поэтому, когда код попадает в E: \ Auftraggeber Projektname 00000 \ Material \ootage , он должен вернуться в верхнюю папку, чтобы продолжить обработку.

Вероятно, это всего лишь одна или две строки кода, но я просто не могу понять это. Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 ноября 2018

Простое решение в этом случае - сохранить старое значение переменной treefix перед ее изменением, а затем вернуться к ней после завершения внутреннего вызова RecurseNodes():

If tn.Nodes.Count > 0 Then
    Dim currentPath As String = treefix
    treefix = treefix & tn.Text & "\"

    RecurseNodes(tn.Nodes)

    treefix = currentPath
End If

Хотя, чтобы избежать необходимости использовать переменные уровня класса, более устойчивое решение - просто передать текущий путь к вашему методу. Кроме того, предпочитайте Path.Combine() при работе с путями в целом:

Private Sub RecurseNodes(ByVal col As TreeNodeCollection, ByVal currentDirectory As String)
    For Each tn As TreeNode In col
        Dim currentPath As String = Path.Combine(currentDirectory, tn.Text)
        Console.WriteLine(currentPath)

        If tn.Nodes.Count > 0 Then
            RecurseNodes(tn.Nodes, currentPath)
        End If
    Next tn
End Sub

Пример использования:

RecurseNodes(TreeView1.Nodes, "E:\Auftraggeber Projektname 00000")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...