golang学习demo1-目录树打印

涉及知识

  • 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, "")
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值