今天拿 Go 完成一個(gè)小操作,把一個(gè)多層的目錄下的 jpg 文件全部檢索出來塞弊,但是發(fā)現(xiàn) go 原生的文件 api 做起來很麻煩
go 的文件可能需要用到以下的包
- io
- io/ioutils
- os
- path
- path/filepath
而且go 很蛋疼的地方在于绍撞,沒有一個(gè)結(jié)構(gòu)體用來統(tǒng)一的描述 文件/文件夾辅辩,所以當(dāng)想要完成 “讀取這個(gè)文件夾下的所有文件”离钝,甚至遞歸遍歷所有文件這樣的邏輯的時(shí)候挣郭,會(huì)特別無措
回想起之前使用java 這種面向?qū)ο蟮恼Z言的時(shí)候浸船,只需要通過一個(gè) File 類就可以實(shí)現(xiàn)這個(gè)邏輯了
所以決定自己封裝一個(gè) go 的 File 類(File 結(jié)構(gòu)體)
封裝之后妄迁,使用一個(gè) File 結(jié)構(gòu)體來統(tǒng)一描述文件和文件夾,上面的操作只需要使用以下代碼就可以完成了
package main
import (
"fmt"
"github.com/Ericwyn/GoTools/file"
)
var jpgArr = make([]file.File, 0)
func main() {
// 使用 OpenFile 創(chuàng)建一個(gè) File 對(duì)象
rootDir := file.OpenFile("./photoDir")
// 調(diào)用遞歸函數(shù)
searchAllJpg(rootDir)
// 打印所有的 jpg 文件的絕對(duì)路徑
for _,jpgFile := range jpgArr {
fmt.Println(jpgFile.AbsPath())
}
}
func searchAllJpg(rootDir file.File) {
// 獲取 rootDir 下的全部文件和文件夾
childrenFiles := rootDir.Children()
for _,fileTemp := range childrenFiles {
if fileTemp.IsFile() && fileTemp.Ext() == ".jpg" {
// 如果這個(gè)子 File 是一個(gè)文件對(duì)象李命,并且后綴名是 .jpg
jpgArr = append(jpgArr, fileTemp)
} else if fileTemp.IsDir() {
// 如果這個(gè)子 File 是一個(gè)文件夾登淘,那么遞歸遍歷
searchAllJpg(fileTemp)
}
}
}
對(duì)比起 Go 原生的 io API,真的是簡(jiǎn)單方便又養(yǎng)眼封字!
該工具主要有以下的功能
- 封裝一個(gè)一個(gè) struct 用來統(tǒng)一描述 文件/文件夾
- 獲取路徑/絕對(duì)路徑/父文件夾路徑
- 獲取/文件(夾)名/后綴名
- 文件(夾)的創(chuàng)建/重命名/移動(dòng)/刪除
- 文件的讀取/文本文件的單行讀取
- 文件的寫入
- 文件(夾)的存在判斷