/
zip.go
83 lines (76 loc) · 1.46 KB
/
zip.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
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
82
83
package gopcak
import (
"archive/zip"
"io"
"os"
"path"
"path/filepath"
)
type Zip struct {
ZipWriter *zip.Writer
}
// NewZip Create new *Zip, need output target
func NewZip(target io.Writer, readers ...io.Reader) (p *Zip, e error) {
p = &Zip{
ZipWriter: zip.NewWriter(target),
}
if p.ZipWriter == nil {
e = ErrNilTarget
return
}
e = p.Add(readers...)
return
}
// Add new readers, copy to ZipWriter
func (z *Zip) Add(readers ...io.Reader) error {
for _, src := range readers {
if osFile, ok := src.(*os.File); ok {
fi, _ := osFile.Stat()
if !fi.IsDir() {
err := z.CopyFile(osFile)
if err != nil {
return err
}
} else {
err := filepath.Walk(osFile.Name(), func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
file, _ := os.Open(path)
return z.CopyFile(file)
})
if err != nil {
return err
}
}
}
// TODO future
// if _, ok := src.(_); ok {
// }
}
return nil
}
func (z *Zip) Pack(readers ...io.Reader) error {
err := z.Add(readers...)
if err != nil {
return err
}
return z.Close()
}
// Close to execute
func (z *Zip) Close() error {
return z.ZipWriter.Close()
}
// CopyFile copy a file to ZipWriter
func (z *Zip) CopyFile(file *os.File) error {
zipWriter := z.ZipWriter
name := path.Clean(file.Name())
made, err := zipWriter.Create(name)
if err != nil {
return err
}
return Copy(made, file)
}