zoukankan      html  css  js  c++  java
  • 【Golang】练习-读取目录下的文件并按时间进行排序

    根目录不包含子目录,使用[]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
    
  • 相关阅读:
    Spring Boot Common application properties(转载)
    SVN中trunk,branches,tags用法详解(转载)
    约定优于配置
    JavaScript封装一个MyAlert弹出框
    JavaScript封装一个实用的select控件
    JavaScript的8行代码搞定js文件引入问题
    JavaScript处理数据完成左侧二级菜单的搭建
    SpringMVC+Mybatis实现的Mysql分页数据查询
    十步完全理解 SQL(转载)
    sql语句练习50题
  • 原文地址:https://www.cnblogs.com/UncleZhao/p/14095661.html
Copyright © 2011-2022 走看看