starainrt/archive.go

70 lines
1.3 KiB
Go
Raw Normal View History

2019-09-26 10:51:13 +08:00
package starainrt
import (
"archive/zip"
"errors"
"fmt"
"io"
"os"
2020-03-02 16:58:33 +08:00
"path/filepath"
"strings"
2019-09-26 10:51:13 +08:00
)
2019-11-14 10:11:27 +08:00
// Unzip 读取位于src的zip文件并解压到dst文件夹中
// shell传入当前解压的文件名称
2019-09-26 10:51:13 +08:00
func Unzip(src, dst string, shell func(string)) error {
2020-03-02 16:58:33 +08:00
dst, err := filepath.Abs(dst)
if err != nil {
return err
}
2019-09-26 10:51:13 +08:00
if !IsFile(src) {
return errors.New(src + " Not Exists")
}
if Exists(dst) && !IsFolder(dst) {
return errors.New(dst + " Exists And Not A Folder")
}
if !Exists(dst) {
2020-03-02 16:58:33 +08:00
err := os.MkdirAll(dst, 0755)
2019-09-26 10:51:13 +08:00
if err != nil {
2020-03-02 16:58:33 +08:00
return err
2019-09-26 10:51:13 +08:00
}
}
zipreader, err := zip.OpenReader(src)
if err != nil {
return err
}
defer zipreader.Close()
for _, v := range zipreader.File {
2020-03-02 16:58:33 +08:00
name := strings.ReplaceAll(v.Name, "\\", string(os.PathSeparator))
2019-09-26 10:51:13 +08:00
if v.FileInfo().IsDir() {
2020-03-02 16:58:33 +08:00
err := os.MkdirAll(dst+string(os.PathSeparator)+name, 0755)
2019-09-26 10:51:13 +08:00
if err != nil {
fmt.Println(err)
}
continue
}
fp, err := v.Open()
if err != nil {
fmt.Println(err)
continue
}
2020-03-02 16:58:33 +08:00
go shell(name)
dir := filepath.Dir(dst + string(os.PathSeparator) + name)
if !Exists(dir) {
os.MkdirAll(dir, 0755)
}
fpdst, err := os.Create(dst + string(os.PathSeparator) + name)
2019-09-26 10:51:13 +08:00
if err != nil {
fmt.Println(err)
continue
}
_, err = io.Copy(fpdst, fp)
if err != nil {
fmt.Println(err)
}
fp.Close()
fpdst.Close()
}
return nil
}