千家信息网

go语言制作的zip压缩程序示例分析

发表于:2024-10-28 作者:千家信息网编辑
千家信息网最后更新 2024年10月28日,今天就跟大家聊聊有关go语言制作的zip压缩程序示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。可以压缩文件和目录。package ma
千家信息网最后更新 2024年10月28日go语言制作的zip压缩程序示例分析

今天就跟大家聊聊有关go语言制作的zip压缩程序示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

可以压缩文件和目录。

package mainimport (  "archive/zip"  "bytes"  "fmt"  "io/ioutil"  "os"  "path/filepath")func main() {  if err := compress(`gopkg`, `gopkg.zip`); err != nil {    fmt.Println(err)  }}// 参数frm可以是文件或目录,不会给dst添加.zip扩展名func compress(frm, dst string) error {  buf := bytes.NewBuffer(make([]byte, 0, 10*1024*1024)) // 创建一个读写缓冲  myzip := zip.NewWriter(buf)              // 用压缩器包装该缓冲  // 用Walk方法来将所有目录下的文件写入zip  err := filepath.Walk(frm, func(path string, info os.FileInfo, err error) error {    var file []byte    if err != nil {      return filepath.SkipDir    }    header, err := zip.FileInfoHeader(info) // 转换为zip格式的文件信息    if err != nil {      return filepath.SkipDir    }    header.Name, _ = filepath.Rel(filepath.Dir(frm), path)    if !info.IsDir() {      // 确定采用的压缩算法(这个是内建注册的deflate)      header.Method = 8      file, err = ioutil.ReadFile(path) // 获取文件内容      if err != nil {        return filepath.SkipDir      }    } else {      file = nil    }    // 上面的部分如果出错都返回filepath.SkipDir    // 下面的部分如果出错都直接返回该错误    // 目的是尽可能的压缩目录下的文件,同时保证zip文件格式正确    w, err := myzip.CreateHeader(header) // 创建一条记录并写入文件信息    if err != nil {      return err    }    _, err = w.Write(file) // 非目录文件会写入数据,目录不会写入数据    if err != nil {    // 因为目录的内容可能会修改      return err     // 最关键的是我不知道咋获得目录文件的内容    }    return nil  })  if err != nil {    return err  }  myzip.Close()        // 关闭压缩器,让压缩器缓冲中的数据写入buf  file, err := os.Create(dst) // 建立zip文件  if err != nil {    return err  }  defer file.Close()  _, err = buf.WriteTo(file) // 将buf中的数据写入文件  if err != nil {    return err  }  return nil}

看完上述内容,你们对go语言制作的zip压缩程序示例分析有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0