ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Golang】练习-读取目录下的文件并按时间进行排序

2020-12-07 09:32:16  阅读:561  来源: 互联网

标签:files fis 读取 err name Golang path 排序 ByModTime


根目录不包含子目录,使用[]os.FileInfo 切片定义文件按时间排序。按时间从远到近排序,文件总数如果大于 5 个,就从远的开始删除。

package main

import (
	"fmt"
	"log"
	"os"
	"sort"
	"strings"
	"time"
)

type ByModTime []os.FileInfo

func (fis ByModTime) Len() int {
	return len(fis)
}

func (fis ByModTime) Swap(i, j int) {
	fis[i], fis[j] = fis[j], fis[i]
}

func (fis ByModTime) Less(i, j int) bool {
	return fis[i].ModTime().Before(fis[j].ModTime())
}
// 根目录下的文件按时间大小排序,从远到近
func SortFile(path, name string) (files ByModTime) {
	f, err := os.Open(path)
	if err != nil {
		fmt.Println(err)
	}
	fis, err := f.Readdir(-1)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	files = make(ByModTime, len(fis)+10)
	j := 0
	for i, v := range fis {
		if strings.Contains(fis[i].Name(), name) {
			files[j] = v
			j++
		}
	}
	files = files[:j]

	sort.Sort(ByModTime(files))
	// for _, fi := range files {
	// 	fmt.Println(fi.Name())
	// }
	return
}

// 返回当下时间的文件,并删除大于 5 个的文件,删除最早的,如果目录下没有文件,就自动创建
func DealWithFiles(path, name string) (filename string) {
	timestamp := time.Now().Format("20060102.150405")
	filename = path + name + "." + timestamp
	files := SortFile(path, name)
	// fmt.Println(path + files[len(files)-1].Name())
	if len(files) > 5 {
		for k, _ := range files[5:] {
			err := os.Remove(path + files[k].Name())
			if err != nil {
				log.Fatal(err)
			}
		}
	} else if len(files) == 0 {
		f, err := os.Create(filename)
		defer f.Close()
		if err != nil {
			log.Fatal(err)
		}
	}
	// fmt.Println(filename)
	return filename
}

func main() {
	path := "/res/csv/"
	name := "user.csv"

	files := DealWithFiles(path, name)
	fmt.Println(files)
}

文件格式为:

# tree /res/csv
/res/csv
├── user.csv.20201206.153543
├── user.csv.20201206.153655
├── user.csv.20201206.153715
├── user.csv.20201206.153749
└── user.csv.20201206.154620

执行结果:

#go run /go/eg/1.go
/res/csv/user.csv.20201207.090806

标签:files,fis,读取,err,name,Golang,path,排序,ByModTime
来源: https://www.cnblogs.com/UncleZhao/p/14095661.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有