go 递归读取目录,并生成树形结构的数据

 基础语法  2023-06-30  admin  710  958

go 递归读取目录,并生成树形结构的数据

// 读取目录中的所有文件,如果是目录则递归读取,生成结构化的树形 struct

package main

import (
    "encoding/json"
    "fmt"
    "os"
    "path/filepath"
)

// TreeNode 文件的树形结构体
type TreeNode struct {
    Name     string
    Path     string
    IsDir    bool
    Children []*TreeNode
}

// RecursionReadDir 递归读取目录
func RecursionReadDir(path string) (*TreeNode, error) {
    info, err := os.Stat(path)
    if err != nil {
       return nil, err
    }

    tree := &TreeNode{
       Name:  info.Name(),
       Path:  path,
       IsDir: info.IsDir(),
    }

    if tree.IsDir {
       files, err := filepath.Glob(filepath.Join(path, "*"))
       if err != nil {
          return nil, err
       }

       for _, f := range files {
          child, err := RecursionReadDir(f)
          if err != nil {
             return nil, err
          }

          tree.Children = append(tree.Children, child)
       }
    }

    return tree, nil
}

// PrintTree 递归打印目录树
func PrintTree(tree TreeNode, index string) {
    fmt.Println(tree.Path, index)
    if tree.IsDir {
       index = index + "-"
       for _, child := range tree.Children {
          PrintTree(*child, index)
       }
    }
}

func main() {
    fileTree, _ := RecursionReadDir("F:\\MyGo\\study")

    //递归打印
    PrintTree(*fileTree, "-")

    //通过json字符串输出
    json, _ := json.Marshal(fileTree)
    fmt.Println(string(json))
}


image.png

image.png

如果文章对您有帮助,点击下方的广告,支持一下作者吧!

相关推荐


go 递归读取目录中所有文件和目录 读取当前目录的文件和目录

递归读取目录中所有文件和目录//ReadDirAll递归读取目录中所有文件和目录 funcReadDirAll(pathstring)([]string,error){ varfiles[]string err:=filepath.Walk(path,func(pathstring,infoos.FileInfo,errerror)error{ iferr!=nil{ re

go 结构体自实现构造函数

Go没有自带的构造函数,采用自实现方式1结构体不复杂,可以返回结构体类型,值拷贝性能开销小funcNewPerson(namestring,ageint8)Person{ returnPerson{ name:name, age:age, } }方式2结构体复杂,得返回结构体指针类型,避免值拷贝产生的性能开销funcNewPerson(namestring,ageint8)*Person

go 结构体和结构体指针

结构体实例化//结构体实例化 //写法1 varaAnimal a.Name="小狗" a.Age=18 //写法2 a2:=Animal{ Name:"dog", Age:18, } fmt.Println(fmt.Sprintf("类型:%T-值:%v占用内存:%v",a,a,unsafe.Sizeof(a))

Linux 压缩 解压文件

一、tar,tar.gz 格式-c建立新的压缩文件 -r添加文件到已经压缩的文件 -u添加改变了和现有的文件到已经存在的压缩文件 -x从压缩的文件中提取文件 -t显示压缩文件的内容 -z支持gzip解压文件 -j支持bzip2解压文件 -v显示操作过程 -k保留源有文件不覆盖 -C切换到指定目录 -f指定压缩文件 --delete删除包中文件 --strip-compo