1
0
mirror of https://github.com/golang/go synced 2024-11-23 10:50:09 -07:00

archive/zip: add Writer.Flush

This is needed for callers to be able to keep track of the
writing position within a zip file. Otherwise it's not
possible to compute the size of headers, and the TOC isn't
written until the very end.

LGTM=adg
R=adg
CC=golang-codereviews
https://golang.org/cl/134210043
This commit is contained in:
Brad Fitzpatrick 2014-08-31 21:32:13 -07:00
parent 4dba769b73
commit 76fb8a5e41
2 changed files with 25 additions and 0 deletions

View File

@ -34,6 +34,12 @@ func NewWriter(w io.Writer) *Writer {
return &Writer{cw: &countWriter{w: bufio.NewWriter(w)}}
}
// Flush flushes any buffered data to the underlying writer.
// Calling Flush is not normally necessary; calling Close is sufficient.
func (w *Writer) Flush() error {
return w.cw.w.(*bufio.Writer).Flush()
}
// Close finishes writing the zip file by writing the central directory.
// It does not (and can not) close the underlying writer.
func (w *Writer) Close() error {

View File

@ -6,6 +6,7 @@ package zip
import (
"bytes"
"io"
"io/ioutil"
"math/rand"
"os"
@ -86,6 +87,24 @@ func TestWriter(t *testing.T) {
}
}
func TestWriterFlush(t *testing.T) {
var buf bytes.Buffer
w := NewWriter(struct{ io.Writer }{&buf})
_, err := w.Create("foo")
if err != nil {
t.Fatal(err)
}
if buf.Len() > 0 {
t.Fatalf("Unexpected %d bytes already in buffer", buf.Len())
}
if err := w.Flush(); err != nil {
t.Fatal(err)
}
if buf.Len() == 0 {
t.Fatal("No bytes written after Flush")
}
}
func testCreate(t *testing.T, w *Writer, wt *WriteTest) {
header := &FileHeader{
Name: wt.Name,