generated from kyoh86/go-base
-
Notifications
You must be signed in to change notification settings - Fork 0
/
copy.go
35 lines (31 loc) · 813 Bytes
/
copy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package source
import (
"io/fs"
"path/filepath"
"strings"
"github.com/kyoh86/my-nerds/ioutil"
)
func CopyDirToLocal(source Source, localDir, src string) (retErr error) {
return source.Walk(src, func(entry string, info fs.FileInfo) error {
if info.Mode()&fs.ModeSymlink == fs.ModeSymlink {
return nil
}
if info.IsDir() {
return nil
}
rel := strings.Split(strings.TrimLeft(strings.TrimPrefix(entry, src), "/"), "/")
return CopyToLocal(source, filepath.Join(append([]string{localDir}, rel...)...), entry)
})
}
func CopyToLocal(source Source, localFile, src string) (retErr error) {
resp, err := source.Open(src)
if err != nil {
return err
}
defer func() {
if err := resp.Close(); err != nil && retErr == nil {
retErr = err
}
}()
return ioutil.CopyToFile(localFile, resp)
}