Golang将文件夹压缩为ZIP格式并加密
Golang将文件夹压缩为ZIP格式并加密,直接上代码。
import ( "archive/zip" "io" "os" "path/filepath" "strings" ezip "github.com/alexmullins/zip" ) // CompressPathToZip 压缩文件夹 func CompressPathToZip(path, targetFile string) error { d, err := os.Create(targetFile) if err != nil { return err } defer d.Close() w := zip.NewWriter(d) defer w.Close() f, err := os.Open(path) if err != nil { return err } err = compress(f, "", w) return err } // EncryptZip 加密压缩文件 func EncryptZip(src, desc, password string) error { zipfile, err := os.Create(desc) if err != nil { return err } defer zipfile.Close() archive := ezip.NewWriter(zipfile) defer archive.Close() filepath.Walk(src, func(path string, info os.FileInfo, err error) error { if err != nil { return err } header, err := ezip.FileInfoHeader(info) if err != nil { return err } header.Name = strings.TrimPrefix(path, filepath.Dir(src)+"/") if info.IsDir() { header.Name += "/" } else { header.Method = zip.Deflate } // 设置密码 header.SetPassword(password) writer, err := archive.CreateHeader(header) if err != nil { return err } if !info.IsDir() { file, err := os.Open(path) if err != nil { return err } defer file.Close() _, err = io.Copy(writer, file) } return err }) return err } func compress(file *os.File, prefix string, zw *zip.Writer) error { info, err := file.Stat() if err != nil { return err } if info.IsDir() { 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) 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 }