1. 場景
需求1:根據日期動態創建文件夾寫文件。
需求2:定時刪除根目錄下的非空目錄,如果子目錄不爲空不刪除,當目錄下的文件被刪除完後,刪除目錄。
2. 代碼
package main
import (
"fmt"
"github.com/satori/go.uuid"
"io/ioutil"
"os"
"path/filepath"
"time"
)
// 生成UUID
func GenerateUUID() string {
u1, _ := uuid.NewV4()
return u1.String()
}
// 獲取目錄下所有的文件夾,包括層級目錄下
func GetDirList(dirpath string) ([]string, error) {
var dir_list []string
dir_err := filepath.Walk(dirpath, func(path string, f os.FileInfo, err error) error {
if f == nil {
return err
}
if f.IsDir() {
//if path != dirpath { //過濾1級文件夾
// dir_list = append(dir_list, path)
//}
dir_list = append(dir_list, path)
return nil
}
return nil
})
return dir_list, dir_err
}
//獲取指定目錄下所有的文件名,包括層級目錄下
func GetAllFile(pathname string, s []string) ([]string, error) {
rd, err := ioutil.ReadDir(pathname)
if err != nil {
fmt.Println("read dir fail:", err)
return s, err
}
for _, fi := range rd {
if fi.IsDir() {
fullDir := pathname + "/" + fi.Name()
s, err = GetAllFile(fullDir, s)
if err != nil {
fmt.Println("read dir fail:", err)
return s, err
}
} else {
//添加文件限制,防止一下子獲取全部文件
if len(s) > 10000 {
fmt.Println("======10000===")
return s, err
}
fullName := pathname + "/" + fi.Name()
s = append(s, fullName)
}
}
return s, nil
}
//根據日期文件夾寫文件
func WriteFile(rootDir string, jsonData string) error {
cnt := 0
for {
//根據日期創建文件夾
curDir := time.Now().Format("20060102\\15\\04") //2006-01-02 15:04:05
err := CreateMutiDir(rootDir + "\\" + curDir) //創建多級目錄
if err != nil {
fmt.Printf("創建文件夾%v失敗,error info:%v:\n", rootDir+curDir, err)
continue
}
fileName := rootDir + "\\" + curDir + "\\" + GenerateUUID() + ".json"
err = ioutil.WriteFile(fileName, []byte(jsonData), 0777) // 寫入文件內容,0777是創建的文件權限
if err != nil {
fmt.Printf("寫%v文件失敗,error info:%v\n", fileName, err)
continue
}
fmt.Println("寫文件成功%v", fileName)
cnt++
fmt.Println("文件總數:", cnt)
time.Sleep(time.Second)
}
return nil
}
//刪除指定目錄下的空文件夾
func DeleteWork(rootDir string) {
for {
//掃描根路徑下的所有文件夾
filePaths, err := GetCurDirList(rootDir)
if err != nil {
fmt.Printf("獲取根目錄下層級目錄[%v]失敗,error info:%v\n", rootDir, err)
return
}
if len(filePaths) == 0 {
fmt.Println("根目錄下爲空目錄")
time.Sleep(time.Second * 5)
continue
}
fmt.Println("文件夾列表: ", filePaths)
//去除當前日期的文件夾
var fileDir []string
curDir := time.Now().Format("20060102")
for _, value := range filePaths {
if value != curDir {
fileDir = append(fileDir, value)
}
}
if len(fileDir) == 0 {
fmt.Println("沒有需要刪除的空目錄")
time.Sleep(time.Second * 5)
continue
}
fmt.Println("過濾後文件夾列表: ", fileDir)
//獲取過濾後文件夾下所有目錄列表
var fileDirList []string
for _, dir := range fileDir {
fileDirList, err = GetDirList(rootDir + "\\" + dir)
if err != nil {
fmt.Println(fileDirList)
continue
}
}
fmt.Println("獲取過濾後目錄", fileDirList)
//遍歷刪除空文件夾
//for _, dirPath := range filelist {
for i := len(fileDirList) - 1; i >= 0; i-- { //從裏往外刪除空文件夾
var files []string
files, _ = GetAllFile(fileDirList[i], files)
if len(files) == 0 {
fmt.Println("刪除空文件夾目錄", fileDirList[i])
//刪除空文件夾
err := os.Remove(fileDirList[i])
if err != nil {
fmt.Println(err)
}
} else {
fmt.Printf("目錄%v文件數量:%v \n", fileDirList[i], len(files))
}
}
//獲取前一天日期
//d, _ := time.ParseDuration("-48h")
//d1 := time.Now().Add(d).Format("20060102")
//fmt.Println(d1)
time.Sleep(time.Second * 5)
}
}
func main() {
go DeleteWork("G:\\test\\Alarm")
//go WriteFile("G:\\test\\Alarm", jsonData)
for {
}
}
//調用os.MkdirAll遞歸創建文件夾
func CreateMutiDir(filePath string) error {
if !isExist(filePath) {
err := os.MkdirAll(filePath, os.ModePerm)
if err != nil {
fmt.Println("創建文件夾失敗,error info:", err)
return err
}
return err
}
return nil
}
//獲取指定目錄下的所有目錄,不進入下一級目錄搜索
func GetCurDirList(dirPth string) ([]string, error) {
var files []string
dir, err := ioutil.ReadDir(dirPth)
if err != nil {
return nil, err
}
for _, fi := range dir {
if fi.IsDir() {
files = append(files, fi.Name())
}
}
return files, nil
}
// 判斷所給路徑文件/文件夾是否存在(返回true是存在)
func isExist(path string) bool {
_, err := os.Stat(path) //os.Stat獲取文件信息
if err != nil {
if os.IsExist(err) {
return true
}
return false
}
return true
}
//測試數據
var jsonData = `{
"commonInfo": {
"operationId": "1212",
"operationType": 2,
"operationTime": "1"
}
}`