55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
|
//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
|
||
|
}
|