/
file_jmod.go
68 lines (58 loc) · 1.21 KB
/
file_jmod.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
package vmutils
import (
"archive/zip"
"bytes"
"io/ioutil"
"path/filepath"
)
type JModFile struct {
absPath string
r *zip.Reader
}
func OpenJModFile(path string) (*JModFile, error) {
if jmodFile, err := NewJModFile(path); err != nil {
return nil, err
} else if err := jmodFile.Open(); err != nil {
return nil, err
} else {
return jmodFile, nil
}
}
func NewJModFile(path string) (*JModFile, error) {
if absPath, err := filepath.Abs(path); err != nil {
return nil, err
} else {
return &JModFile{absPath: absPath}, nil
}
}
func (mf *JModFile) AbsPath() string {
return mf.absPath
}
func (mf *JModFile) IsOpen() bool {
return mf.r != nil
}
func (mf *JModFile) Close() {
mf.r = nil
}
func (mf *JModFile) Open() error {
data, err := ioutil.ReadFile(mf.absPath)
if err != nil {
return err
}
data = data[4:] // skip 0x4a4d0100
r, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
if err == nil {
mf.r = r
}
return err
}
func (mf *JModFile) ReadFile(filename string) ([]byte, error) {
return readFileInZip(mf.r, filename)
}
func (mf *JModFile) ListFiles() []string {
files := make([]string, 0, 100)
for _, f := range mf.r.File {
files = append(files, f.Name)
}
return files
}