-
Notifications
You must be signed in to change notification settings - Fork 5
/
unzipper.go
74 lines (70 loc) · 1.5 KB
/
unzipper.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
package zgok
import (
"archive/zip"
"bytes"
"fmt"
"io"
)
// Unzipper.
type Unzipper struct {
isUnzipped bool // Is the file already unzipped?
reader *bytes.Reader // Byte reader.
size int64 // Size of the zipped file.
}
// Create new unzipper.
func NewUnzipper(zipBytes *[]byte) *Unzipper {
u := &Unzipper{
isUnzipped: false,
reader: bytes.NewReader(*zipBytes),
size: int64(len(*zipBytes)),
}
return u
}
// Unzip all the files in zip.
func (u *Unzipper) Unzip() (FileSystem, error) {
var err error
// Check if it is already unzipped.
if u.isUnzipped {
return nil, fmt.Errorf("already unzipped")
}
// Initialize zip reader.
zipReader, err := zip.NewReader(u.reader, u.size)
if err != nil {
return nil, err
}
// Prepare file system.
zfs := NewFileSystem()
// Get all files.
var readCloser io.ReadCloser
for _, file := range zipReader.File {
// Initialize zgok file.
zgokFile := NewZgokFile()
// Set file path.
path := file.FileHeader.Name
zgokFile.SetPath(path)
// Set file info.
fileInfo := file.FileHeader.FileInfo()
zgokFile.SetFileInfo(fileInfo)
// Open file.
readCloser, err = file.Open()
if err != nil {
break
}
// Copy bytes.
buf := new(bytes.Buffer)
_, err = io.Copy(buf, readCloser)
if err != nil {
break
}
zgokFile.SetBytes(buf.Bytes())
// Close file.
readCloser.Close()
// Add file to file system.
zfs.AddFile(zgokFile)
}
if err != nil {
return nil, err
}
u.isUnzipped = true
return zfs, nil
}