Files
gf/os/gres/gres_func.go

147 lines
3.8 KiB
Go
Raw Normal View History

2019-08-13 13:45:01 +08:00
// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package gres
import (
"archive/zip"
"bytes"
"encoding/hex"
2019-08-13 13:45:01 +08:00
"fmt"
"github.com/gogf/gf/util/gconv"
2019-08-13 13:45:01 +08:00
"github.com/gogf/gf/encoding/gcompress"
"github.com/gogf/gf/os/gfile"
)
2019-08-30 20:29:12 +08:00
const (
gPACKAGE_TEMPLATE = `package %s
import "github.com/gogf/gf/os/gres"
func init() {
if err := gres.Add("%s"); err != nil {
2019-08-30 20:29:12 +08:00
panic(err)
}
}
`
)
// Pack packs the path specified by <srcPaths> into bytes.
2019-08-13 21:06:11 +08:00
// The unnecessary parameter <keyPrefix> indicates the prefix for each file
// packed into the result bytes.
//
// Note that parameter <srcPaths> supports multiple paths join with ','.
func Pack(srcPaths string, keyPrefix ...string) ([]byte, error) {
2019-08-13 13:45:01 +08:00
buffer := bytes.NewBuffer(nil)
headerPrefix := ""
if len(keyPrefix) > 0 && keyPrefix[0] != "" {
headerPrefix = keyPrefix[0]
}
err := gcompress.ZipPathWriter(srcPaths, buffer, headerPrefix)
2019-08-13 13:45:01 +08:00
if err != nil {
return nil, err
}
// Gzip the data bytes to reduce the size.
return gcompress.Gzip(buffer.Bytes(), 9)
2019-08-13 13:45:01 +08:00
}
// PackToFile packs the path specified by <srcPaths> to target file <dstPath>.
2019-08-13 21:06:11 +08:00
// The unnecessary parameter <keyPrefix> indicates the prefix for each file
// packed into the result bytes.
//
// Note that parameter <srcPaths> supports multiple paths join with ','.
func PackToFile(srcPaths, dstPath string, keyPrefix ...string) error {
data, err := Pack(srcPaths, keyPrefix...)
2019-08-13 13:45:01 +08:00
if err != nil {
return err
}
return gfile.PutBytes(dstPath, data)
}
// PackToGoFile packs the path specified by <srcPaths> to target go file <goFilePath>
2019-08-13 21:06:11 +08:00
// with given package name <pkgName>.
//
// The unnecessary parameter <keyPrefix> indicates the prefix for each file
// packed into the result bytes.
//
// Note that parameter <srcPaths> supports multiple paths join with ','.
2019-08-13 13:45:01 +08:00
func PackToGoFile(srcPath, goFilePath, pkgName string, keyPrefix ...string) error {
data, err := Pack(srcPath, keyPrefix...)
if err != nil {
return err
}
return gfile.PutContents(
goFilePath,
fmt.Sprintf(gPACKAGE_TEMPLATE, pkgName, bytesToHexStr(data)),
2019-08-13 13:45:01 +08:00
)
}
2019-08-13 21:06:11 +08:00
// Unpack unpacks the content specified by <path> to []*File.
2019-08-13 13:45:01 +08:00
func Unpack(path string) ([]*File, error) {
realPath, err := gfile.Search(path)
if err != nil {
return nil, err
}
return UnpackContent(gfile.GetContents(realPath))
2019-08-13 13:45:01 +08:00
}
2019-08-13 21:06:11 +08:00
// UnpackContent unpacks the content to []*File.
func UnpackContent(content string) ([]*File, error) {
var data []byte
var err error
if isHexStr(content) {
data, err = gcompress.UnGzip(hexStrToBytes(content))
if err != nil {
return nil, err
}
} else {
data, err = gcompress.UnGzip(gconv.UnsafeStrToBytes(content))
if err != nil {
return nil, err
}
}
reader, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
2019-08-13 13:45:01 +08:00
if err != nil {
return nil, err
}
array := make([]*File, len(reader.File))
for i, file := range reader.File {
2019-08-14 22:03:52 +08:00
array[i] = &File{file: file}
2019-08-13 13:45:01 +08:00
}
return array, nil
}
// isHexStr checks and returns whether given content <s> is hex string.
// It returns true if <s> is hex string, or false if not.
func isHexStr(s string) bool {
var r bool
for i := 0; i < len(s); i++ {
r = (s[i] >= '0' && s[i] <= '9') ||
(s[i] >= 'a' && s[i] <= 'f') ||
(s[i] >= 'A' && s[i] <= 'F')
if !r {
return false
}
}
return true
}
// bytesToHexString converts binary content to hex string content.
func bytesToHexStr(b []byte) string {
dst := make([]byte, hex.EncodedLen(len(b)))
hex.Encode(dst, b)
return gconv.UnsafeBytesToStr(dst)
}
// hexStrToBytes converts hex string content to []byte.
func hexStrToBytes(s string) []byte {
src := gconv.UnsafeStrToBytes(s)
dst := make([]byte, hex.DecodedLen(len(src)))
hex.Decode(dst, src)
return dst
}