涉及知识
- go程序当前执行目录的获取
- 文件与目录包的简单使用
- 切片的简单使用
- go的格式化输出
因为用win10的tree工具的打印结果不是很满意, 比如执行 tree /f
结果是这样的
卷 Fiveplus 的文件夹 PATH 列表
卷序列号为 5EBE-3DA3
C:.
│ ftree.exe
│ hello.go
│ pathnow.exe
│
└─filetree
files.exe
files.go
ftree.exe
ftree.go
getpath.exe
getpath.go
pathnow.go
readme.md
结构不是非常清晰, 于是准备自己写一个. 用什么语言? 这几天刚学golang, 那就用go吧, 练练手.
我的程序打印的结果是这样的(文件优先打印)
C:\Go\src\github.com\goinaction\code\mycode-1
├── ftree.exe
├── hello.go
├── pathnow.exe
└── filetree
├── files.exe
├── files.go
├── ftree.exe
├── ftree.go
├── getpath.exe
├── getpath.go
├── pathnow.go
└── readme.md
看起来就比 tree 清晰很多了. 编译出可执行文件之后, 将它添加到环境变量, 就可以直接在终端输入命令打印当前目录下的目录树了.
源码
/*
一个将当前路径下文件树打印的程序, 忽略 . 开头文件
*/
package main
import (
"fmt"
"io/ioutil"
"os"
)
func getPath(path string, indent string) {
files, err := ioutil.ReadDir(path)
if err != nil {
fmt.Println("read file path error", err)
return
}
// 忽略以 . 开头的文件
for i := 0; i < len(files); i++ {
if files[i].Name()[0] == '.' {
files = append(files[:i], files[i + 1:]...)
}
}
dirs := make([]string, 0)
// 先打印文件
for _, fi := range files {
if ! fi.IsDir() {
dirs = append(dirs, fi.Name())
}
}
lenFile := len(dirs)
// 再打印文件夹
for _, fi := range files {
if fi.IsDir() {
dirs = append(dirs, fi.Name())
}
}
// 最后一个文件的分支用 └── 表示, 更美观
for i := 0; i < len(dirs); i++ {
if i == len(dirs) - 1 {
fmt.Println(indent + "└── " + dirs[i])
if i >= lenFile {
getPath(path + "\\" + dirs[i], indent + " ")
}
} else {
fmt.Println(indent + "├── " + dirs[i])
if i >= lenFile {
getPath(path + "\\" + dirs[i], indent + "│ ")
}
}
}
}
func main() {
exPath, err := os.Getwd() // 获取程序执行的当前路径
if err != nil {
fmt.Println("路径错误")
}
fmt.Println(exPath)
getPath(exPath, "")
}