前言
有时候,我看着我的目录,或者我想找个文件时,尤其是目录很多时,总是有点难受。
比如这个目录,是我的一个教程目录。
但是我并不能一目了然的知道每个文件夹下都有啥,并且每次找一个文件也很费事。
所以,基于上述的需求,使用Go语言,终于撸了个目录生成器,感觉还行。
实现的效果
通过编写的脚本,可以将目录整合成.txt文件,并且下级目录使用4个空格缩进。
代码
先别管怎么实现的,先看代码。
- package main
- import (
- "bytes"
- "flag"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- )
- func GenderNSymbol(char byte, count int) string {
- symbolSince := bytes.Repeat([]byte{char}, count)
- var symbol = string(symbolSince)
- return symbol
- }
- // @title GenderDirTree
- // @description 生成目录树
- // @param path string "需要生成的目录"
- // @param count int "生成相同字符的个数"
- // @param char byte "生成相同字符的字符"
- // @param current_tier int "当前层数"
- // @param end_tier int "终止层数"
- // @param fileObj int "文件对象"
- // @return 无 无 "无"
- func GenderDirTree(path string, count int, char byte, current_tier int, end_tier int, fileObj *os.File) {
- if !(current_tier < end_tier) && end_tier != 0 {
- return
- }
- current_tier++
- files, err := ioutil.ReadDir(path)
- if err != nil {
- fmt.Println("错误:目录错误")
- return
- }
- for _, file := range files {
- var name = file.Name()
- //生成指定数目的相同符号
- var plac = GenderNSymbol(char, count)
- //符号+目录
- var sname = fmt.Sprintf("%s%s\n", plac, name)
- //输出当前目录
- fileObj.WriteString(sname)
- //fmt.Println(sname)
- //判断是否为目录,如果是,继续下次递归
- var isDir = file.IsDir()
- if isDir {
- //拼接传入的目录和循环的当前目录
- var nerPaht = filepath.Join(path, name)
- GenderDirTree(nerPaht, count+4, char, current_tier, end_tier, fileObj)
- }
- }
- }
- func main() {
- //终止层数,0表示无限层,>0表示指定层数
- var end_tier int
- //输入的目录
- //var path = `D:\0_教程\易锦教程`
- var path string
- flag.StringVar(&path, "path", "", "目录")
- flag.IntVar(&end_tier, "tier", 0, "终止层数")
- flag.Parse()
- //文件对象
- var wDirPath = filepath.Join(path, "目录.txt")
- fileObj, _ := os.OpenFile(wDirPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
- defer fileObj.Close()
- //生成目录树
- GenderDirTree(path, 0, ' ', 0, end_tier, fileObj)
- }
去掉注释,其实也就30行代码,就实现了这个功能。
实现的功能
- 自定义要生成的目录。
- 自定义生成目录终止的层数。
打包
- go build main.go
-help
采用flag包动态控制参数,参数如下。
- d:>main.exe -h
- Usage of main.exe:
- -path string
- 目录
- -tier int
- 终止层数
运行
语法
- main.exe -path <要生成的目录> -tier <终止层级>
- 注意:-tier,终止层数,0表示无限层,>0表示指定层数,默认为0
示例
此处-tier指定的是0,表示无限制生成,如果指定是1,就表示生成一层。
结果
会在要生成的目录下,多出一个目录.txt。
打开如下
主要代码理解
flag
fileObj
判断是否为目录,递归
总结
本次更像是日常使用中,为了解决实际问题的脚本,其实脚本使用Python更好。
但是Go有一个更大的优势就是可以编译为exe。
这次的难点主要是理解递归,自己调自己!