golang中压缩和解压文件可以使用标准库:archive/zip。
zip压缩文件
package main import ( "archive/zip" "bytes" "log" "os" ) func main() { // 创建一个缓冲区用来保存压缩文件内容 buf := new(bytes.Buffer) // 创建一个压缩文档 w := zip.NewWriter(buf) // 将文件加入压缩文档 var files = []struct { Name, Body string }{ {"readme.txt", "This archive contains some text files."}, {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, {"todo.txt", "Get animal handling licence.\nWrite more examples."}, } for _, file := range files { f, err := w.Create(file.Name) if err != nil { log.Fatal(err) } _, err = f.Write([]byte(file.Body)) if err != nil { log.Fatal(err) } } // 关闭压缩文档 err := w.Close() if err != nil { log.Fatal(err) } // 将压缩文档内容写入文件 f, err := os.OpenFile("file.zip", os.O_CREATE|os.O_WRONLY, 0666) if err != nil { log.Fatal(err) } buf.WriteTo(f) }
这个示例来自官方文档,官方文档中并没有将压缩的内容写入到文件,所以一开始执行的时候什么都没有输出。后来看懂了程序,自己补上了写入文件的代码。
运行
$ go run zip.go
生成file.zip文件

golang中zip压缩文件
zip解压文件
对上面的压缩文件解压一下:
package main import ( "archive/zip" "fmt" "io" "log" "os" ) func main() { // 打开一个zip格式文件 r, err := zip.OpenReader("file.zip") if err != nil { log.Fatal(err) } defer r.Close() // 迭代压缩文件中的文件,打印出文件中的内容 for _, f := range r.File { fmt.Printf("文件名 %s:\n", f.Name) rc, err := f.Open() if err != nil { log.Fatal(err) } _, err = io.CopyN(os.Stdout, rc, int64(f.UncompressedSize64)) if err != nil { log.Fatal(err) } rc.Close() fmt.Println() } }
运行
$ go run unzip.go 文件名 readme.txt: This archive contains some text files. 文件名 gopher.txt: Gopher names: George Geoffrey Gonzo 文件名 todo.txt: Get animal handling licence. Write more examples.
转载请注明:快乐编程 » golang中zip压缩和解压文件