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