mirror of
https://github.com/xxjwxc/public.git
synced 2025-09-26 20:01:19 +08:00
140 lines
2.5 KiB
Go
140 lines
2.5 KiB
Go
package tools
|
||
|
||
import (
|
||
"archive/zip"
|
||
"bytes"
|
||
"io"
|
||
"os"
|
||
"path/filepath"
|
||
)
|
||
|
||
// IsZip 是否zip文件
|
||
func IsZip(zipPath string) bool {
|
||
f, err := os.Open(zipPath)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
defer f.Close()
|
||
|
||
buf := make([]byte, 4)
|
||
if n, err := f.Read(buf); err != nil || n < 4 {
|
||
return false
|
||
}
|
||
|
||
return bytes.Equal(buf, []byte("PK\x03\x04"))
|
||
}
|
||
|
||
// Unzip 解压
|
||
func Unzip(archive, target string) error {
|
||
reader, err := zip.OpenReader(archive)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
if err := os.MkdirAll(target, 0755); err != nil {
|
||
return err
|
||
}
|
||
|
||
for _, file := range reader.File {
|
||
path := filepath.Join(target, file.Name)
|
||
if file.FileInfo().IsDir() {
|
||
os.MkdirAll(path, file.Mode())
|
||
continue
|
||
}
|
||
//------------注入
|
||
|
||
dir := filepath.Dir(path)
|
||
if len(dir) > 0 {
|
||
if _, err = os.Stat(dir); os.IsNotExist(err) {
|
||
err = os.MkdirAll(dir, 0755)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
|
||
//---------------------end
|
||
|
||
fileReader, err := file.Open()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer fileReader.Close()
|
||
|
||
targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer targetFile.Close()
|
||
|
||
if _, err := io.Copy(targetFile, fileReader); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// Compress 压缩文件
|
||
//files 文件数组,可以是不同dir下的文件或者文件夹
|
||
//dest 压缩文件存放地址
|
||
func Compress(files []*os.File, dest string) error {
|
||
d, _ := os.Create(dest)
|
||
defer d.Close()
|
||
w := zip.NewWriter(d)
|
||
defer w.Close()
|
||
for _, file := range files {
|
||
err := compress(file, "", w)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func compress(file *os.File, prefix string, zw *zip.Writer) error {
|
||
info, err := file.Stat()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if info.IsDir() {
|
||
if len(prefix) == 0 {
|
||
prefix = info.Name()
|
||
} else {
|
||
prefix = prefix + "/" + info.Name()
|
||
}
|
||
fileInfos, err := file.Readdir(-1)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
for _, fi := range fileInfos {
|
||
f, err := os.Open(file.Name() + "/" + fi.Name())
|
||
if err != nil {
|
||
return err
|
||
}
|
||
err = compress(f, prefix, zw)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
} else {
|
||
header, err := zip.FileInfoHeader(info)
|
||
if len(prefix) != 0 {
|
||
header.Name = prefix + "/" + header.Name
|
||
}
|
||
if err != nil {
|
||
return err
|
||
}
|
||
writer, err := zw.CreateHeader(header)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
_, err = io.Copy(writer, file)
|
||
file.Close()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|