-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathutils.go
More file actions
81 lines (75 loc) · 1.62 KB
/
Copy pathutils.go
File metadata and controls
81 lines (75 loc) · 1.62 KB
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package binance_data
import (
"archive/zip"
"fmt"
"io"
"net/url"
"os"
"path/filepath"
"strconv"
"strings"
)
const outDir = "binance_data" // output base directory
func localPathForURL(u string) (string, error) {
parsed, err := url.Parse(u)
if err != nil {
return "", err
}
// extract prefix=... if present
if q := parsed.RawQuery; q != "" {
for _, part := range strings.Split(q, "&") {
if strings.HasPrefix(part, "prefix=") {
val := strings.TrimPrefix(part, "prefix=")
val = strings.TrimPrefix(val, "data/")
return filepath.Join(outDir, filepath.FromSlash(val)), nil
}
}
}
// fallback to path
p := strings.TrimPrefix(parsed.Path, "/")
p = strings.TrimPrefix(p, "data/")
return filepath.Join(outDir, filepath.FromSlash(p)), nil
}
func ensureDir(p string) error { return os.MkdirAll(p, 0o755) }
func parseInt64(s string) int64 {
v, _ := strconv.ParseInt(s, 10, 64)
return v
}
func extractZipFile(zipPath string) error {
r, err := zip.OpenReader(zipPath)
if err != nil {
return err
}
defer r.Close()
destDir := strings.TrimSuffix(zipPath, ".zip")
if err := ensureDir(destDir); err != nil {
return err
}
for _, f := range r.File {
fp := filepath.Join(destDir, f.Name)
if f.FileInfo().IsDir() {
ensureDir(fp)
continue
}
if err := ensureDir(filepath.Dir(fp)); err != nil {
return err
}
rc, err := f.Open()
if err != nil {
return err
}
out, err := os.Create(fp)
if err != nil {
rc.Close()
return err
}
_, err = io.Copy(out, rc)
rc.Close()
out.Close()
if err != nil {
return err
}
}
fmt.Printf("Extracted: %s -> %s/\n", zipPath, destDir)
return nil
}