star/filedate/filedate_windows.go

55 lines
1.1 KiB
Go
Raw Permalink Normal View History

//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
}