1package copyfile
2
3import (
4	"fmt"
5	"syscall"
6	"unsafe"
7)
8
9var (
10	modkernel32   = syscall.NewLazyDLL("kernel32.dll")
11	procCopyFileW = modkernel32.NewProc("CopyFileW")
12)
13
14// CopyFile is a utility for copying a file - used for the LCOW scratch cache.
15// Uses CopyFileW win32 API for performance.
16func CopyFile(srcFile, destFile string, overwrite bool) error {
17	var bFailIfExists uint32 = 1
18	if overwrite {
19		bFailIfExists = 0
20	}
21
22	lpExistingFileName, err := syscall.UTF16PtrFromString(srcFile)
23	if err != nil {
24		return err
25	}
26	lpNewFileName, err := syscall.UTF16PtrFromString(destFile)
27	if err != nil {
28		return err
29	}
30	r1, _, err := syscall.Syscall(
31		procCopyFileW.Addr(),
32		3,
33		uintptr(unsafe.Pointer(lpExistingFileName)),
34		uintptr(unsafe.Pointer(lpNewFileName)),
35		uintptr(bFailIfExists))
36	if r1 == 0 {
37		return fmt.Errorf("failed CopyFileW Win32 call from '%s' to '%s': %s", srcFile, destFile, err)
38	}
39	return nil
40}
41