LEFT | RIGHT |
1 package tar_test | 1 package tar_test |
2 | 2 |
3 import ( | 3 import ( |
4 "archive/tar" | 4 "archive/tar" |
5 "bytes" | 5 "bytes" |
6 "fmt" | 6 "fmt" |
7 "io" | 7 "io" |
8 "log" | 8 "log" |
9 "os" | 9 "os" |
10 ) | 10 ) |
11 | 11 |
12 func Example() { | 12 func Example() { |
13 » w := new(bytes.Buffer) | 13 » // Create a buffer to write our archive to. |
14 » // Write to tar archive. | 14 » buf := new(bytes.Buffer) |
15 » tw := tar.NewWriter(w) | 15 |
16 » names := []string{"testdata/small.txt", "testdata/small2.txt"} | 16 » // Create a new tar archive. |
17 » for _, name := range names { | 17 » tw := tar.NewWriter(buf) |
18 » » fr, err := os.Open(name) | 18 |
19 » » if err != nil { | 19 » // Add some files to the archive. |
| 20 » var files = []struct { |
| 21 » » Name, Body string |
| 22 » }{ |
| 23 » » {"readme.txt", "This archive contains some text files."}, |
| 24 » » {"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"}, |
| 25 » » {"todo.txt", "Get animal handling licence."}, |
| 26 » } |
| 27 » for _, file := range files { |
| 28 » » hdr := &tar.Header{ |
| 29 » » » Name: file.Name, |
| 30 » » » Size: int64(len(file.Body)), |
| 31 » » } |
| 32 » » if err := tw.WriteHeader(hdr); err != nil { |
20 log.Fatalln(err) | 33 log.Fatalln(err) |
21 } | 34 } |
22 » » defer fr.Close() | 35 » » if _, err := tw.Write([]byte(file.Body)); err != nil { |
23 » » fi, err := fr.Stat() | |
24 » » if err != nil { | |
25 » » » log.Fatalln(err) | |
26 » » } | |
27 » » hdr, err := tar.FileInfoHeader(fi, "") | |
28 » » if err != nil { | |
29 » » » log.Fatalln(err) | |
30 » » } | |
31 » » if err = tw.WriteHeader(hdr); err != nil { | |
32 » » » log.Fatalln(err) | |
33 » » } | |
34 » » if _, err = io.Copy(tw, fr); err != nil { | |
35 log.Fatalln(err) | 36 log.Fatalln(err) |
36 } | 37 } |
37 } | 38 } |
38 » tw.Close() | 39 » // Make sure to check the error on Close. |
| 40 » if err := tw.Close(); err != nil { |
| 41 » » log.Fatalln(err) |
| 42 » } |
39 | 43 |
40 » // Read from tar archive. | 44 » // Open the tar archive for reading. |
41 » r := bytes.NewReader(w.Bytes()) | 45 » r := bytes.NewReader(buf.Bytes()) |
42 tr := tar.NewReader(r) | 46 tr := tar.NewReader(r) |
| 47 |
| 48 // Iterate through the files in the archive. |
43 for { | 49 for { |
44 hdr, err := tr.Next() | 50 hdr, err := tr.Next() |
45 if err == io.EOF { | 51 if err == io.EOF { |
46 // end of tar archive | 52 // end of tar archive |
47 break | 53 break |
48 } | 54 } |
49 if err != nil { | 55 if err != nil { |
50 log.Fatalln(err) | 56 log.Fatalln(err) |
51 } | 57 } |
52 » » fmt.Println("name:", hdr.Name) | 58 » » fmt.Printf("Contents of %s:\n", hdr.Name) |
53 » » io.Copy(os.Stdout, tr) | 59 » » if _, err := io.Copy(os.Stdout, tr); err != nil { |
| 60 » » » log.Fatalln(err) |
| 61 » » } |
54 fmt.Println() | 62 fmt.Println() |
55 } | 63 } |
| 64 |
56 // Output: | 65 // Output: |
57 » // name: small.txt | 66 » // Contents of readme.txt: |
58 » // Kilts | 67 » // This archive contains some text files. |
59 » // name: small2.txt | 68 » // Contents of gopher.txt: |
60 » // Google.com | 69 » // Gopher names: |
| 70 » // George |
| 71 » // Geoffrey |
| 72 » // Gonzo |
| 73 » // Contents of todo.txt: |
| 74 » // Get animal handling licence. |
61 } | 75 } |
LEFT | RIGHT |