//go:build windows package filedate import ( "fmt" "golang.org/x/sys/windows" "time" ) func SetFileTime(path string, ctime, atime, mtime time.Time) error { path16, err := windows.UTF16PtrFromString(path) if err != nil { return err } handle, err := windows.CreateFile( path16, windows.FILE_WRITE_ATTRIBUTES, windows.FILE_SHARE_READ|windows.FILE_SHARE_WRITE|windows.FILE_SHARE_DELETE, nil, windows.OPEN_EXISTING, windows.FILE_FLAG_BACKUP_SEMANTICS, 0, ) if err != nil { return fmt.Errorf("CreateFile failed: %w", err) } defer windows.CloseHandle(handle) var ( ctimePtr *windows.Filetime atimePtr *windows.Filetime mtimePtr *windows.Filetime ) if !ctime.IsZero() { ctimeFt := windows.NsecToFiletime(ctime.UnixNano()) ctimePtr = &ctimeFt } if !atime.IsZero() { atimeFt := windows.NsecToFiletime(atime.UnixNano()) atimePtr = &atimeFt } if !mtime.IsZero() { mtimeFt := windows.NsecToFiletime(mtime.UnixNano()) mtimePtr = &mtimeFt } if err := windows.SetFileTime(handle, ctimePtr, atimePtr, mtimePtr); err != nil { return fmt.Errorf("SetFileTime failed: %w", err) } return nil }