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