github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/local/setbtime_windows.go (about)

     1  //go:build windows
     2  
     3  package local
     4  
     5  import (
     6  	"syscall"
     7  	"time"
     8  )
     9  
    10  const haveSetBTime = true
    11  
    12  // setBTime sets the birth time of the file passed in
    13  func setBTime(name string, btime time.Time) (err error) {
    14  	pathp, err := syscall.UTF16PtrFromString(name)
    15  	if err != nil {
    16  		return err
    17  	}
    18  	h, err := syscall.CreateFile(pathp,
    19  		syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_WRITE, nil,
    20  		syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	defer func() {
    25  		closeErr := syscall.Close(h)
    26  		if err == nil {
    27  			err = closeErr
    28  		}
    29  	}()
    30  	bFileTime := syscall.NsecToFiletime(btime.UnixNano())
    31  	return syscall.SetFileTime(h, &bFileTime, nil, nil)
    32  }