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