copy_windows.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //go:build windows
  2. // +build windows
  3. package cmd
  4. import (
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "syscall"
  9. "unsafe"
  10. )
  11. func localCopy(src, target string) error {
  12. // Create target directory if it doesn't exist
  13. dirPath := filepath.Dir(target)
  14. if err := os.MkdirAll(dirPath, 0o755); err != nil {
  15. return err
  16. }
  17. // Open source file
  18. sourceFile, err := os.Open(src)
  19. if err != nil {
  20. return err
  21. }
  22. defer sourceFile.Close()
  23. // Create target file
  24. targetFile, err := os.Create(target)
  25. if err != nil {
  26. return err
  27. }
  28. defer targetFile.Close()
  29. // Use CopyFileExW to copy the file
  30. err = copyFileEx(src, target)
  31. if err != nil {
  32. return err
  33. }
  34. return nil
  35. }
  36. func copyFileEx(src, dst string) error {
  37. fmt.Println("HELELELLEEOEOEOEO")
  38. kernel32 := syscall.NewLazyDLL("kernel32.dll")
  39. copyFileEx := kernel32.NewProc("CopyFileExW")
  40. srcPtr, err := syscall.UTF16PtrFromString(src)
  41. if err != nil {
  42. return err
  43. }
  44. dstPtr, err := syscall.UTF16PtrFromString(dst)
  45. if err != nil {
  46. return err
  47. }
  48. r1, _, err := copyFileEx.Call(
  49. uintptr(unsafe.Pointer(srcPtr)),
  50. uintptr(unsafe.Pointer(dstPtr)),
  51. 0, 0, 0, 0)
  52. if r1 == 0 {
  53. return err
  54. }
  55. return nil
  56. }