package main

Go措辞中的打印树形目录结构_遍历_目次 智能助手

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 库也是一个现成的办理方案,它可以简化树形构造的创建和打印过程。