Skip to content

Commit cd67bf7

Browse files
committed
zip archive create method
1 parent 95268c7 commit cd67bf7

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

archive.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright (c) Jeevanandam M. (https://github.com/jeevatkm)
2+
// go-aah/essentials source code and usage is governed by a MIT style
3+
// license that can be found in the LICENSE file.
4+
5+
package ess
6+
7+
import (
8+
"archive/zip"
9+
"fmt"
10+
"io"
11+
"os"
12+
"path/filepath"
13+
"strings"
14+
)
15+
16+
// Zip method creates zip archive for given file or directory.
17+
func Zip(dest, src string) error {
18+
if !IsFileExists(src) {
19+
return fmt.Errorf("source does not exists: %v", src)
20+
}
21+
22+
if IsFileExists(dest) {
23+
return fmt.Errorf("destination archive already exists: %v", dest)
24+
}
25+
26+
zf, err := os.Create(dest)
27+
if err != nil {
28+
return err
29+
}
30+
defer CloseQuietly(zf)
31+
32+
archive := zip.NewWriter(zf)
33+
defer CloseQuietly(archive)
34+
35+
sinfo, err := os.Stat(src)
36+
if err != nil {
37+
return err
38+
}
39+
40+
var baseDir string
41+
if sinfo.IsDir() {
42+
baseDir = filepath.Base(src)
43+
}
44+
45+
err = Walk(src, func(path string, info os.FileInfo, err error) error {
46+
if err != nil {
47+
return err
48+
}
49+
50+
header, err := zip.FileInfoHeader(info)
51+
if err != nil {
52+
return err
53+
}
54+
55+
if !IsStrEmpty(baseDir) {
56+
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, src))
57+
}
58+
59+
if info.IsDir() {
60+
header.Name += "/"
61+
} else {
62+
header.Method = zip.Deflate
63+
}
64+
65+
writer, err := archive.CreateHeader(header)
66+
if err != nil {
67+
return err
68+
}
69+
70+
if info.IsDir() {
71+
return nil
72+
}
73+
74+
file, err := os.Open(path)
75+
if err != nil {
76+
return err
77+
}
78+
defer CloseQuietly(file)
79+
80+
_, err = io.Copy(writer, file)
81+
return err
82+
})
83+
84+
return err
85+
}

0 commit comments

Comments
 (0)