...
1
16
17 package util
18
19 import (
20 "io"
21 "os"
22 "strings"
23
24 "github.com/pkg/errors"
25
26 "k8s.io/klog/v2"
27 )
28
29
30 func CopyFile(src, dest string) error {
31 sourceFileInfo, err := os.Stat(src)
32 if err != nil {
33 return err
34 }
35
36 sourceFile, err := os.Open(src)
37 if err != nil {
38 return err
39 }
40 defer func() {
41 _ = sourceFile.Close()
42 }()
43
44 destFile, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, sourceFileInfo.Mode())
45 if err != nil {
46 return err
47 }
48 defer func() {
49 _ = destFile.Close()
50 }()
51
52 _, err = io.Copy(destFile, sourceFile)
53
54 return err
55 }
56
57
58 func MoveFile(src, dest string) error {
59 err := os.Rename(src, dest)
60 if err != nil && strings.Contains(err.Error(), "invalid cross-device link") {
61
62
63
64
65 klog.V(4).Infof("cannot rename %v to %v due to %v, attempting an alternative method", src, dest, err)
66 if err := CopyFile(src, dest); err != nil {
67 return errors.Wrapf(err, "failed to copy file %v to %v", src, dest)
68 }
69 return os.Remove(src)
70 }
71 return err
72 }
73
View as plain text