2 changed files with 192 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,192 @@ |
|||
package util |
|||
|
|||
import ( |
|||
"archive/zip" |
|||
"crypto/sha256" |
|||
"encoding/base64" |
|||
"fmt" |
|||
"io" |
|||
"os" |
|||
"path" |
|||
"path/filepath" |
|||
"strings" |
|||
) |
|||
|
|||
// base64 encode
|
|||
// url safe
|
|||
func Bas64end(str string) string { |
|||
// bdata:=
|
|||
return base64.URLEncoding.EncodeToString([]byte(str)) |
|||
} |
|||
|
|||
// base64 url safe uneconde
|
|||
func Base64dec(bsstr string) string { |
|||
dedc, _ := base64.URLEncoding.DecodeString(bsstr) |
|||
return string(dedc) |
|||
} |
|||
|
|||
// 计算文件的hash
|
|||
func CalacHash(rfile string) string { |
|||
// 获取到真实地址
|
|||
//
|
|||
file, err := os.Open(rfile) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
defer file.Close() |
|||
|
|||
// initlize hash object
|
|||
hash := sha256.New() |
|||
|
|||
// write file into hash object
|
|||
if _, err := io.Copy(hash, file); err != nil { |
|||
panic(err) |
|||
} |
|||
// get hash value
|
|||
hashBytes := hash.Sum(nil) |
|||
//converto to hash string
|
|||
hastString := fmt.Sprintf("%x", hashBytes) |
|||
return hastString |
|||
} |
|||
|
|||
// 判断文件是否存在
|
|||
func IsFileExist(filename string) bool { |
|||
if _, err := os.Stat(filename); err == nil { |
|||
return true |
|||
} |
|||
return false |
|||
} |
|||
|
|||
// 解压缩zip文件
|
|||
// 这个方法必须是首字母大写的,才能被注册
|
|||
// src: 需要解压的zip文件
|
|||
// curPath: 解压到的路径
|
|||
func DecompressZip(zpFname string, curPath string) error { |
|||
// 下载文件
|
|||
archive, err := zip.OpenReader(zpFname) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
// 取zip文件的绝对路径的文件夹。会默认解压到files下,暂停使用
|
|||
// dir := filepath.Dir(zpFname)
|
|||
defer archive.Close() |
|||
// 遍历目录
|
|||
for _, f := range archive.File { |
|||
// zip 解压的时候,路径为监听的路径
|
|||
filePath := filepath.Join(curPath, f.Name) |
|||
// 暂停原因 屏蔽解压到files 目录下
|
|||
//filePath := filepath.Join(dir, f.Name)
|
|||
if f.FileInfo().IsDir() { |
|||
os.MkdirAll(filePath, os.ModePerm) |
|||
continue |
|||
} |
|||
// 父文件夹开始创建目录
|
|||
if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil { |
|||
return fmt.Errorf("failed to make directory (%v)", err) |
|||
} |
|||
// 文件原有模式
|
|||
dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) |
|||
if err != nil { |
|||
return fmt.Errorf("failed to create file (%v)", err) |
|||
} |
|||
fileInArchive, err := f.Open() |
|||
if err != nil { |
|||
return fmt.Errorf("failed to open file in zip (%v)", err) |
|||
} |
|||
if _, err := io.Copy(dstFile, fileInArchive); err != nil { |
|||
return fmt.Errorf("failed to copy file in zip (%v)", err) |
|||
} |
|||
dstFile.Close() |
|||
fileInArchive.Close() |
|||
} |
|||
return nil |
|||
} |
|||
|
|||
// dest:目的地址以及压缩文件名 eg:/data/logZip/2022-12-12-log.zip
|
|||
// paths:需要压缩的所有文件所组成的集合
|
|||
func CompressToZip(dest string, currentPath string, paths []string) error { |
|||
// fmt.Printf("currentPath:%s\n", currentPath)
|
|||
// fmt.Printf("paths len:%d\n", len(paths))
|
|||
// fmt.Println("real path", currentPath)
|
|||
// 打开files 目录
|
|||
filesPath := "" |
|||
if dir, err := os.Getwd(); err == nil { |
|||
filesPath = dir + "/sync_zips/" |
|||
} |
|||
if err := os.MkdirAll(filesPath, os.ModePerm); err != nil { |
|||
fmt.Println(err.Error()) |
|||
} |
|||
// ToSlash 过滤windows的斜杠引起的bug
|
|||
zfile, err := os.Create(path.Join("./sync_zips", "/", dest)) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
defer zfile.Close() |
|||
zipWriter := zip.NewWriter(zfile) |
|||
defer zipWriter.Close() |
|||
|
|||
// 遍历带压缩的目录信息
|
|||
for _, src := range paths { |
|||
// 替换文件名,并且去除前后 "\" 或 "/"
|
|||
// path = strings.Trim(path, string(filepath.Separator))
|
|||
// 从配置中读取到源目录
|
|||
src = path.Join(currentPath, "/", src) |
|||
// 删除尾随路径(如果它是目录)
|
|||
src = strings.TrimSuffix(src, string(os.PathSeparator)) |
|||
// fmt.Printf("zip src:%s\n", src)
|
|||
// 文件遍历
|
|||
err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error { |
|||
// fmt.Printf("zip path:%s\n", path)
|
|||
if err != nil { |
|||
return err |
|||
} |
|||
// 创建本地文件头
|
|||
header, err := zip.FileInfoHeader(info) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
|
|||
// 监听的工作目录作为文件的结尾,然后取相对路径
|
|||
// 在zip存档中设置文件的相对路径
|
|||
// 将压缩包中的绝对路径替换为相对路径
|
|||
header.Name, err = filepath.Rel(filepath.Dir(src), path) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
|
|||
// 转换为Unix风格的路径分隔符
|
|||
header.Name = filepath.ToSlash(header.Name) |
|||
|
|||
// 目录需要拼上一个 "/" ,否则会出现一个和目录一样的文件在压缩包中
|
|||
if info.IsDir() { |
|||
header.Name += "/" |
|||
} else { |
|||
// 将压缩方法设置为deflate
|
|||
header.Method = zip.Deflate |
|||
} |
|||
// fmt.Printf("zip header:%v\n", header.Name)
|
|||
// 创建写入头的writer
|
|||
headerWriter, err := zipWriter.CreateHeader(header) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
if info.IsDir() { |
|||
return nil |
|||
} |
|||
f, err := os.Open(path) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
defer f.Close() |
|||
_, err = io.Copy(headerWriter, f) |
|||
return err |
|||
}) |
|||
|
|||
if err != nil { |
|||
return err |
|||
} |
|||
} |
|||
// 存到指定位置
|
|||
os.Rename(dest, path.Join("./sync_zips/", dest)) |
|||
return nil |
|||
} |
|||
Loading…
Reference in new issue