41 lines
921 B
Go
41 lines
921 B
Go
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
|
|
}
|