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 }
以上所述就是本文的全部内容了,希望大家能够喜欢。