copy_windows.go 884 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package cmd
  2. import (
  3. "os"
  4. "path/filepath"
  5. "syscall"
  6. )
  7. func localCopy(src, target string) error {
  8. dirPath := filepath.Dir(target)
  9. if err := os.MkdirAll(dirPath, 0o755); err != nil {
  10. return err
  11. }
  12. sourceFile, err := os.Open(src)
  13. if err != nil {
  14. return err
  15. }
  16. defer sourceFile.Close()
  17. targetFile, err := os.Create(target)
  18. if err != nil {
  19. return err
  20. }
  21. defer targetFile.Close()
  22. sourceHandle := syscall.Handle(sourceFile.Fd())
  23. targetHandle := syscall.Handle(targetFile.Fd())
  24. err = copyFileEx(sourceHandle, targetHandle)
  25. if err != nil {
  26. return err
  27. }
  28. return nil
  29. }
  30. func copyFileEx(srcHandle, dstHandle syscall.Handle) error {
  31. kernel32 := syscall.NewLazyDLL("kernel32.dll")
  32. copyFileEx := kernel32.NewProc("CopyFileExW")
  33. r1, _, err := copyFileEx.Call(
  34. uintptr(srcHandle),
  35. uintptr(dstHandle),
  36. 0, 0, 0, 0)
  37. if r1 == 0 {
  38. return err
  39. }
  40. return nil
  41. }