Golang學習篇——定時刪除指定目錄下的空文件夾

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"
	}
}`

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章