package copyfile import ( "fmt" "syscall" "unsafe" ) var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procCopyFileW = modkernel32.NewProc("CopyFileW") ) // CopyFile is a utility for copying a file - used for the LCOW scratch cache. // Uses CopyFileW win32 API for performance. func CopyFile(srcFile, destFile string, overwrite bool) error { var bFailIfExists uint32 = 1 if overwrite { bFailIfExists = 0 } lpExistingFileName, err := syscall.UTF16PtrFromString(srcFile) if err != nil { return err } lpNewFileName, err := syscall.UTF16PtrFromString(destFile) if err != nil { return err } r1, _, err := syscall.Syscall( procCopyFileW.Addr(), 3, uintptr(unsafe.Pointer(lpExistingFileName)), uintptr(unsafe.Pointer(lpNewFileName)), uintptr(bFailIfExists)) if r1 == 0 { return fmt.Errorf("failed CopyFileW Win32 call from '%s' to '%s': %s", srcFile, destFile, err) } return nil }