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