Go措辞中的打印树形目录结构_遍历_目次
package main
import (
"fmt"
"os"
"path/filepath"
)
// TreeNode 用于存储目录或文件信息
type TreeNode struct {
Name string
IsDir bool
Children []TreeNode
}
// PrintTree 打印目录树
func PrintTree(node TreeNode, prefix string) {
fmt.Printf("%s%s %s\n", prefix, strings.Repeat(" ", len(prefix)-1), node.Name)
if node.IsDir {
for _, child := range node.Children {
PrintTree(child, prefix+"| ")
}
}
}
// TraverseDir 遍历目录并构建目录树
func TraverseDir(root string) (TreeNode, error) {
rootNode := &TreeNode{Name: root, IsDir: true}
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
relativePath, err := filepath.Rel(root, path)
if err != nil {
return err
}
node := &TreeNode{
Name: relativePath,
IsDir: info.IsDir(),
}
parentDirs := strings.Split(relativePath, string(filepath.Separator))
current := rootNode
for i := 0; i < len(parentDirs); i++ {
childName := parentDirs[i]
found := false
for _, existingChild := range current.Children {
if existingChild.Name == childName {
current = existingChild
found = true
break
}
}
if !found {
newChild := &TreeNode{Name: childName, IsDir: i < len(parentDirs)-1}
current.Children = append(current.Children, newChild)
current = newChild
}
}
return nil
})
if err != nil {
return nil, err
}
return rootNode, nil
}
func main() {
root := "./" // 更换为你要遍历的目录路径
treeRoot, err := TraverseDir(root)
if err != nil {
fmt.Println("Error traversing directory:", err)
return
}
PrintTree(treeRoot, "")
}
这个代码首先定义了一个 TreeNode 构造体来表示目录树中的每个节点。然后通过 TraverseDir 函数递归地遍历指定目录下的所有子目录和文件,并构建出对应的树状构造。末了,PrintTree 函数卖力以树形办法打印目录构造。
请把稳,上述代码没有处理并发遍历目录的情形,如果你须要提高性能,可以考虑利用 Goroutine 进行并发遍历。其余,gotree 库也是一个现成的办理方案,它可以简化树形构造的创建和打印过程。
本文系作者个人观点,不代表本站立场,转载请注明出处!