用golang遞歸構建無限級樹狀目錄json數據和數據庫

package main

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

func main() {
	rootpath := "D:\\projects"

	root := FileNode{"projects", rootpath, []*FileNode{}}
	fileInfo, _ := os.Lstat(rootpath)

	walk(rootpath, fileInfo, &root)

	data, _ := json.Marshal(root)

	fmt.Printf("%s", data)
}

type FileNode struct {
	Name      string      `json:"name"`
	Path      string      `json:"path"`
	FileNodes []*FileNode `json:"children"`
}

func walk(path string, info os.FileInfo, node *FileNode) {
	// 列出當前目錄下的全部目錄、文件
	files := listFiles(path)

	// 遍歷這些文件
	for _, filename := range files {
		// 拼接全路徑
		fpath := filepath.Join(path, filename)

		// 構造文件結構
		fio, _ := os.Lstat(fpath)

		// 將當前文件做爲子節點添加到目錄下
		child := FileNode{filename, fpath, []*FileNode{}}
		node.FileNodes = append(node.FileNodes, &child)

		// 若是遍歷的當前文件是個目錄,則進入該目錄進行遞歸
		if fio.IsDir() {
			walk(fpath, fio, &child)
		}
	}

	return
}

func listFiles(dirname string) []string {
	f, _ := os.Open(dirname)

	names, _ := f.Readdirnames(-1)
	f.Close()

	sort.Strings(names)

	return names
}
相關文章
相關標籤/搜索