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 }