简言

1. golang为我们提供了完善的文件操作库,例如os,ioutil等
2. 如果你还不知道如何获取目录下的所有文件,

3. 如果只修改文件的最后访问时间,最后修改时间,可以使用os.Chtimes()函数


 

效果如下图

下面这个是文件目录图         执行效果如下图(可以看到所有文件的创建时间,最后访问时间,最后修改时间都改成了当前时间)

golang修改文件的创建时间,最后访问时间,最后修改时间_修改时间

   

golang修改文件的创建时间,最后访问时间,最后修改时间_golang修改文件最后访问_02

 

完整代码如下

package main
import (
"fmt"
"io/ioutil"
"os"
"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
}

// 修改文件的创建时间,最后访问时间,最后修改时间
func SetFileTime(path string, ctime, atime, mtime time.Time) (err error) {
path, err = syscall.FullPath(path)
if err != nil {
return
}
pathPtr, err := syscall.UTF16PtrFromString(path)
if err != nil {
return
}
handle, err := syscall.CreateFile(pathPtr, syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_WRITE, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
if err != nil {
return
}
defer syscall.Close(handle)
a := syscall.NsecToFiletime(syscall.TimespecToNsec(syscall.NsecToTimespec(atime.UnixNano())))
c := syscall.NsecToFiletime(syscall.TimespecToNsec(syscall.NsecToTimespec(ctime.UnixNano())))
m := syscall.NsecToFiletime(syscall.TimespecToNsec(syscall.NsecToTimespec(mtime.UnixNano())))
return syscall.SetFileTime(handle, &c, &a, &m)
}

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

// 打印文件的创建时间,最后访问时间,最后修改时间
func PrintFileTime(pathname string) {
// 获取文件原来的访问时间,修改时间
finfo, _ := os.Stat(pathname)
// linux环境下代码如下
//linuxFileAttr := finfo.Sys().(*syscall.Stat_t)
//fmt.Println("文件创建时间", SecondToTime(linuxFileAttr.Ctim.Sec))
//fmt.Println("最后访问时间", SecondToTime(linuxFileAttr.Atim.Sec))
//fmt.Println("最后修改时间", SecondToTime(linuxFileAttr.Mtim.Sec))
// windows下代码如下
winFileAttr := finfo.Sys().(*syscall.Win32FileAttributeData)
fmt.Println("文件创建时间:",SecondToTime(winFileAttr.CreationTime.Nanoseconds()/1e9))
fmt.Println("最后访问时间:",SecondToTime(winFileAttr.LastAccessTime.Nanoseconds()/1e9))
fmt.Println("最后修改时间:",SecondToTime(winFileAttr.LastWriteTime.Nanoseconds()/1e9))
}

func main() {
// 递归获取目录下的所有文件
var files []string
files, _ = GetAllFile("E:/test/go/modify_file_time_3")

fmt.Println("目录下的所有文件如下")
for i:=0;i<len(files);i++ {
fmt.Println("文件名:",files[i])

// 打印三个时间
PrintFileTime(files[i])

// 修改
fmt.Println("修改文件的创建时间,最后访问时间,最后修改时间")
now := time.Now()
SetFileTime(files[i], now, now,now)

// 再次打印三个时间
PrintFileTime(files[i])
}
}