IDC

手把手教你用Go语言开发一款简易目录生成器

作者:admin 2021-07-05 我要评论

前言 有时候,我看着我的目录,或者我想找个文件时,尤其是目录很多时,总是有点难受。 比如这个目录,是我的一个教程目录。 但是我并不能一目了然的知道每个文件夹下...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

前言

有时候,我看着我的目录,或者我想找个文件时,尤其是目录很多时,总是有点难受。


比如这个目录,是我的一个教程目录。

但是我并不能一目了然的知道每个文件夹下都有啥,并且每次找一个文件也很费事。

所以,基于上述的需求,使用Go语言,终于撸了个目录生成器,感觉还行。

实现的效果


通过编写的脚本,可以将目录整合成.txt文件,并且下级目录使用4个空格缩进。

代码

先别管怎么实现的,先看代码。

  1. package main 
  2.  
  3. import ( 
  4.     "bytes" 
  5.     "flag" 
  6.     "fmt" 
  7.     "io/ioutil" 
  8.     "os" 
  9.     "path/filepath" 
  10.  
  11. func GenderNSymbol(char byte, count int) string { 
  12.     symbolSince := bytes.Repeat([]byte{char}, count
  13.     var symbol = string(symbolSince) 
  14.     return symbol 
  15.  
  16. // @title    GenderDirTree 
  17. // @description   生成目录树 
  18. // @param     path        string         "需要生成的目录" 
  19. // @param     count        int           "生成相同字符的个数" 
  20. // @param     char        byte           "生成相同字符的字符" 
  21. // @param     current_tier        int            "当前层数" 
  22. // @param     end_tier        int            "终止层数" 
  23. // @param     fileObj        int            "文件对象" 
  24. // @return    无        无         "无" 
  25. func GenderDirTree(path string, count intchar byte, current_tier int, end_tier int, fileObj *os.File) { 
  26.     if !(current_tier < end_tier) && end_tier != 0 { 
  27.         return 
  28.     current_tier++ 
  29.     files, err := ioutil.ReadDir(path) 
  30.     if err != nil { 
  31.         fmt.Println("错误:目录错误"
  32.         return 
  33.     for _, file := range files { 
  34.         var name = file.Name() 
  35.         //生成指定数目的相同符号 
  36.         var plac = GenderNSymbol(charcount
  37.         //符号+目录 
  38.         var sname = fmt.Sprintf("%s%s\n", plac, name
  39.         //输出当前目录 
  40.         fileObj.WriteString(sname) 
  41.         //fmt.Println(sname) 
  42.         //判断是否为目录,如果是,继续下次递归 
  43.         var isDir = file.IsDir() 
  44.         if isDir { 
  45.             //拼接传入的目录和循环的当前目录 
  46.             var nerPaht = filepath.Join(path, name
  47.             GenderDirTree(nerPaht, count+4, char, current_tier, end_tier, fileObj) 
  48.         } 
  49.  
  50. func main() { 
  51.     //终止层数,0表示无限层,>0表示指定层数 
  52.     var end_tier int 
  53.     //输入的目录 
  54.     //var path = `D:\0_教程\易锦教程` 
  55.     var path string 
  56.     flag.StringVar(&path, "path""""目录"
  57.     flag.IntVar(&end_tier, "tier", 0, "终止层数"
  58.     flag.Parse() 
  59.     //文件对象 
  60.     var wDirPath = filepath.Join(path, "目录.txt"
  61.     fileObj, _ := os.OpenFile(wDirPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 
  62.     defer fileObj.Close() 
  63.     //生成目录树 
  64.     GenderDirTree(path, 0, ' ', 0, end_tier, fileObj) 

去掉注释,其实也就30行代码,就实现了这个功能。

实现的功能

  • 自定义要生成的目录。
  • 自定义生成目录终止的层数。

打包

  1. go build main.go 

-help

采用flag包动态控制参数,参数如下。

  1. d:>main.exe -h 
  2. Usage of main.exe: 
  3.   -path string 
  4.         目录 
  5.   -tier int 
  6.         终止层数 

运行

语法

  1. main.exe -path <要生成的目录> -tier <终止层级> 
  2. 注意:-tier,终止层数,0表示无限层,>0表示指定层数,默认为0 

示例

此处-tier指定的是0,表示无限制生成,如果指定是1,就表示生成一层。

结果

会在要生成的目录下,多出一个目录.txt。


打开如下


主要代码理解

flag


fileObj


判断是否为目录,递归


总结

本次更像是日常使用中,为了解决实际问题的脚本,其实脚本使用Python更好。

但是Go有一个更大的优势就是可以编译为exe。

这次的难点主要是理解递归,自己调自己!


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/f0EpKWbIOOBPxOjFvWsZEQ

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • []*T *[]T *[]*T 傻傻分不清楚

    []*T *[]T *[]*T 傻傻分不清楚

  • B站,牛逼!

    B站,牛逼!

  • 如何保证 Serverless 业务部署更新的一

    如何保证 Serverless 业务部署更新的一

  • Room 中的数据库自动迁移功能

    Room 中的数据库自动迁移功能

腾讯云代理商
海外云服务器