File: setfiletime_windows.go

package info (click to toggle)
golang-golang-x-tools 1%3A0.5.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bookworm-backports
  • size: 16,592 kB
  • sloc: javascript: 2,011; asm: 1,635; sh: 192; yacc: 155; makefile: 52; ansic: 8
file content (33 lines) | stat: -rw-r--r-- 1,039 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build windows
// +build windows

package filecache

import (
	"syscall"
	"time"
)

// setFileTime updates the access and modification times of a file.
func setFileTime(filename string, atime, mtime time.Time) error {
	// Latency of this function was measured on the builder
	// at median=1.9ms 90%=6.8ms 95%=12ms.

	filename16, err := syscall.UTF16PtrFromString(filename)
	if err != nil {
		return err
	}
	// See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfiletime
	h, err := syscall.CreateFile(filename16, syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_WRITE, nil, syscall.OPEN_EXISTING, 0, 0)
	if err != nil {
		return err
	}
	defer syscall.Close(h) // ignore error
	afiletime := syscall.NsecToFiletime(atime.UnixNano())
	mfiletime := syscall.NsecToFiletime(mtime.UnixNano())
	return syscall.SetFileTime(h, nil, &afiletime, &mfiletime)
}