我想构建一个通过树视图递归的功能,并在硬盘驱动器上创建每个文件夹。到目前为止,代码运行良好。一旦到达节点的末端,它就会跳得更深一层。但是,我在这里缺少的是一行代码,可以跳回到上一级文件夹以继续创建其他文件夹。 这是我到目前为止的内容:
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
因此,一旦代码到达 E:\ Auftraggeber项目名称00000 \ Material \ Footage ,它应返回上一级文件夹以继续处理。
这可能只是一行或两行代码,但我无法弄清楚。 感谢您的帮助!
答案 0 :(得分:2)
在这种情况下,简单的解决方案是先存储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")