package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "runtime"
    "syscall"
    "time"
)

// ? 根据目录返回所有文件

func GetAllFile(pathname string) ([]string, error) {
    result := []string{}

    fis, err := ioutil.ReadDir(pathname)
    if err != nil {
        fmt.Printf("读取文件目录失败,pathname=%v, err=%v \n", pathname, err)
        return result, err
    }

    // 所有文件/文件夹
    for _, fi := range fis {
        fullname := pathname + "/" + fi.Name()
        // 是文件夹则递归进入获取;是文件,则压入数组
        if fi.IsDir() {
            temp, err := GetAllFile(fullname)
            if err != nil {
                fmt.Printf("读取文件目录失败,fullname=%v, err=%v", fullname, err)
                return result, err
            }
            result = append(result, temp...)
        } else {
            result = append(result, fullname)
        }
    }

    return result, nil
}

// ? 把秒级的时间戳转为time格式
func SecondToTime(sec int64) time.Time {
    return time.Unix(sec, 0)
}

// ? 根据文件返回时间(创建时间 ctime 访问时间 atime 修改时间 utime)
func GetFileTime(filename string) (ctime time.Time, atime time.Time, utime time.Time) {
    finfo, _ := os.Stat(filename)
    sysType := runtime.GOOS
    if sysType == "linux" {
        linuxFileAttr := finfo.Sys().(*syscall.Stat_t)
        ctime = SecondToTime(linuxFileAttr.Ctim.Sec)
        atime = SecondToTime(linuxFileAttr.Atim.Sec)
        utime = SecondToTime(linuxFileAttr.Mtim.Sec)
    }

    if sysType == "windows" {
        winFileAttr := finfo.Sys().(*syscall.Win32FileAttributeData)

        ctime = SecondToTime(winFileAttr.CreationTime.Nanoseconds() / 1e9)
        atime = SecondToTime(winFileAttr.LastAccessTime.Nanoseconds() / 1e9)
        utime = SecondToTime(winFileAttr.LastWriteTime.Nanoseconds() / 1e9)
    }
    return ctime, atime, utime
}