1*333d2b36SAndroid Build Coastguard Worker// Copyright 2012 The Go Authors. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style 3*333d2b36SAndroid Build Coastguard Worker// license that can be found in the LICENSE file. 4*333d2b36SAndroid Build Coastguard Worker 5*333d2b36SAndroid Build Coastguard Workerpackage zip_test 6*333d2b36SAndroid Build Coastguard Worker 7*333d2b36SAndroid Build Coastguard Workerimport ( 8*333d2b36SAndroid Build Coastguard Worker "archive/zip" 9*333d2b36SAndroid Build Coastguard Worker "bytes" 10*333d2b36SAndroid Build Coastguard Worker "compress/flate" 11*333d2b36SAndroid Build Coastguard Worker "fmt" 12*333d2b36SAndroid Build Coastguard Worker "io" 13*333d2b36SAndroid Build Coastguard Worker "log" 14*333d2b36SAndroid Build Coastguard Worker "os" 15*333d2b36SAndroid Build Coastguard Worker) 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerfunc ExampleWriter() { 18*333d2b36SAndroid Build Coastguard Worker // Create a buffer to write our archive to. 19*333d2b36SAndroid Build Coastguard Worker buf := new(bytes.Buffer) 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker // Create a new zip archive. 22*333d2b36SAndroid Build Coastguard Worker w := zip.NewWriter(buf) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker // Add some files to the archive. 25*333d2b36SAndroid Build Coastguard Worker var files = []struct { 26*333d2b36SAndroid Build Coastguard Worker Name, Body string 27*333d2b36SAndroid Build Coastguard Worker }{ 28*333d2b36SAndroid Build Coastguard Worker {"readme.txt", "This archive contains some text files."}, 29*333d2b36SAndroid Build Coastguard Worker {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, 30*333d2b36SAndroid Build Coastguard Worker {"todo.txt", "Get animal handling licence.\nWrite more examples."}, 31*333d2b36SAndroid Build Coastguard Worker } 32*333d2b36SAndroid Build Coastguard Worker for _, file := range files { 33*333d2b36SAndroid Build Coastguard Worker f, err := w.Create(file.Name) 34*333d2b36SAndroid Build Coastguard Worker if err != nil { 35*333d2b36SAndroid Build Coastguard Worker log.Fatal(err) 36*333d2b36SAndroid Build Coastguard Worker } 37*333d2b36SAndroid Build Coastguard Worker _, err = f.Write([]byte(file.Body)) 38*333d2b36SAndroid Build Coastguard Worker if err != nil { 39*333d2b36SAndroid Build Coastguard Worker log.Fatal(err) 40*333d2b36SAndroid Build Coastguard Worker } 41*333d2b36SAndroid Build Coastguard Worker } 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker // Make sure to check the error on Close. 44*333d2b36SAndroid Build Coastguard Worker err := w.Close() 45*333d2b36SAndroid Build Coastguard Worker if err != nil { 46*333d2b36SAndroid Build Coastguard Worker log.Fatal(err) 47*333d2b36SAndroid Build Coastguard Worker } 48*333d2b36SAndroid Build Coastguard Worker} 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Workerfunc ExampleReader() { 51*333d2b36SAndroid Build Coastguard Worker // Open a zip archive for reading. 52*333d2b36SAndroid Build Coastguard Worker r, err := zip.OpenReader("testdata/readme.zip") 53*333d2b36SAndroid Build Coastguard Worker if err != nil { 54*333d2b36SAndroid Build Coastguard Worker log.Fatal(err) 55*333d2b36SAndroid Build Coastguard Worker } 56*333d2b36SAndroid Build Coastguard Worker defer r.Close() 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker // Iterate through the files in the archive, 59*333d2b36SAndroid Build Coastguard Worker // printing some of their contents. 60*333d2b36SAndroid Build Coastguard Worker for _, f := range r.File { 61*333d2b36SAndroid Build Coastguard Worker fmt.Printf("Contents of %s:\n", f.Name) 62*333d2b36SAndroid Build Coastguard Worker rc, err := f.Open() 63*333d2b36SAndroid Build Coastguard Worker if err != nil { 64*333d2b36SAndroid Build Coastguard Worker log.Fatal(err) 65*333d2b36SAndroid Build Coastguard Worker } 66*333d2b36SAndroid Build Coastguard Worker _, err = io.CopyN(os.Stdout, rc, 68) 67*333d2b36SAndroid Build Coastguard Worker if err != nil { 68*333d2b36SAndroid Build Coastguard Worker log.Fatal(err) 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker rc.Close() 71*333d2b36SAndroid Build Coastguard Worker fmt.Println() 72*333d2b36SAndroid Build Coastguard Worker } 73*333d2b36SAndroid Build Coastguard Worker // Output: 74*333d2b36SAndroid Build Coastguard Worker // Contents of README: 75*333d2b36SAndroid Build Coastguard Worker // This is the source code repository for the Go programming language. 76*333d2b36SAndroid Build Coastguard Worker} 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Workerfunc ExampleWriter_RegisterCompressor() { 79*333d2b36SAndroid Build Coastguard Worker // Override the default Deflate compressor with a higher compression level. 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker // Create a buffer to write our archive to. 82*333d2b36SAndroid Build Coastguard Worker buf := new(bytes.Buffer) 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker // Create a new zip archive. 85*333d2b36SAndroid Build Coastguard Worker w := zip.NewWriter(buf) 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker // Register a custom Deflate compressor. 88*333d2b36SAndroid Build Coastguard Worker w.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) { 89*333d2b36SAndroid Build Coastguard Worker return flate.NewWriter(out, flate.BestCompression) 90*333d2b36SAndroid Build Coastguard Worker }) 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Worker // Proceed to add files to w. 93*333d2b36SAndroid Build Coastguard Worker} 94