手把手教你用Go語言開發(fā)一款簡易目錄生成器
前言
有時候,我看著我的目錄,或者我想找個文件時,尤其是目錄很多時,總是有點難受。
比如這個目錄,是我的一個教程目錄。
但是我并不能一目了然的知道每個文件夾下都有啥,并且每次找一個文件也很費事。
所以,基于上述的需求,使用Go語言,終于擼了個目錄生成器,感覺還行。
實現(xiàn)的效果
通過編寫的腳本,可以將目錄整合成.txt文件,并且下級目錄使用4個空格縮進(jìn)。
代碼
先別管怎么實現(xiàn)的,先看代碼。
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 "生成相同字符的個數(shù)"
// @param char byte "生成相同字符的字符"
// @param current_tier int "當(dāng)前層數(shù)"
// @param end_tier int "終止層數(shù)"
// @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()
//生成指定數(shù)目的相同符號
var plac = GenderNSymbol(char, count)
//符號+目錄
var sname = fmt.Sprintf("%s%s\n", plac, name)
//輸出當(dāng)前目錄
fileObj.WriteString(sname)
//fmt.Println(sname)
//判斷是否為目錄,如果是,繼續(xù)下次遞歸
var isDir = file.IsDir()
if isDir {
//拼接傳入的目錄和循環(huán)的當(dāng)前目錄
var nerPaht = filepath.Join(path, name)
GenderDirTree(nerPaht, count+4, char, current_tier, end_tier, fileObj)
}
}
}
func main() {
//終止層數(shù),0表示無限層,>0表示指定層數(shù)
var end_tier int
//輸入的目錄
//var path = `D:\0_教程\易錦教程`
var path string
flag.StringVar(&path, "path", "", "目錄")
flag.IntVar(&end_tier, "tier", 0, "終止層數(shù)")
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行代碼,就實現(xiàn)了這個功能。
實現(xiàn)的功能
- 自定義要生成的目錄。
- 自定義生成目錄終止的層數(shù)。
打包
go build main.go
-help
采用flag包動態(tài)控制參數(shù),參數(shù)如下。
d:>main.exe -h
Usage of main.exe:
-path string
目錄
-tier int
終止層數(shù)
運行
語法
main.exe -path <要生成的目錄> -tier <終止層級>
注意:-tier,終止層數(shù),0表示無限層,>0表示指定層數(shù),默認(rèn)為0
示例
此處-tier指定的是0,表示無限制生成,如果指定是1,就表示生成一層。
結(jié)果
會在要生成的目錄下,多出一個目錄.txt。
打開如下
主要代碼理解
flag
fileObj
判斷是否為目錄,遞歸
總結(jié)
本次更像是日常使用中,為了解決實際問題的腳本,其實腳本使用Python更好。
但是Go有一個更大的優(yōu)勢就是可以編譯為exe。
這次的難點主要是理解遞歸,自己調(diào)自己!