手把手教你用Go语言开发一款简易目录生成器
2023-03-14 09:35:17 时间
前言
有时候,我看着我的目录,或者我想找个文件时,尤其是目录很多时,总是有点难受。
![](https://s2.51cto.com/oss/202101/21/58f6d65c103bbbb82c10ce336e91b9da.png)
比如这个目录,是我的一个教程目录。
但是我并不能一目了然的知道每个文件夹下都有啥,并且每次找一个文件也很费事。
所以,基于上述的需求,使用Go语言,终于撸了个目录生成器,感觉还行。
实现的效果
![](https://s3.51cto.com/oss/202101/21/881658b3291e289f990e1c2efb6c1eca.png)
通过编写的脚本,可以将目录整合成.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。
![](https://s6.51cto.com/oss/202101/21/63a83ec6b58bd6947f97e552e4ebb8e0.png)
打开如下
![](https://s3.51cto.com/oss/202101/21/a07bc053ef633b61407ff6cf8f40348f.png)
主要代码理解
flag
![](https://s6.51cto.com/oss/202101/21/0b6913ff947b0b294724a6ce07a967a7.png)
fileObj
![](https://s5.51cto.com/oss/202101/21/45ddfd142341c6b64ee19421968faf79.png)
判断是否为目录,递归
![](https://s4.51cto.com/oss/202101/21/58234d2f6950f5f00f30a91b2be5cbe4.png)
总结
本次更像是日常使用中,为了解决实际问题的脚本,其实脚本使用Python更好。
但是Go有一个更大的优势就是可以编译为exe。
这次的难点主要是理解递归,自己调自己!
相关文章
- 如何在 Ubuntu 中安装 Viber
- HarmonyOS 基于ArkUI(ETS) 实现雷达扫描
- Github 推出“赞助商专用”仓库,根据赞助金额解锁新功能
- 供应链分析:保持物流顺畅的五个技巧
- HashSet 集合,从入门到精通
- OpenHarmony数据转码应用开发实战(上)
- 微软或将推出瘦客户端 PC:搭载 Windows 365 云电脑服务,价格便宜但有广告
- Vanilla OS:不只是原味 GNOME 的 Ubuntu
- 如何分析产品新功能的效果?
- Linux运维之json文件操作
- 如何通过 chroot 恢复 Arch Linux 安装
- 关于 find 命令的15个超级有用的例子
- 如何在 Linux 命令行中删除指定扩展名的文件
- 数据发现在数据网格架构中的重要性
- WebAssembly入门(Golang版)你学会了吗?
- 每个数据分析师都应该了解的六个预测模型
- Bash、Source、“.”和“./”执行的区别
- 如何在 Ubuntu和 Debian 上创建 sudo 用户
- 如何在 Linux 中更改 Shell
- 大数据和算法是如何把人拉入无尽的娱乐深渊的