offset uint64
}
+// WriterOptions contains configuration options for a zip.Writer.
+type WriterOptions struct {
+ // Offset modifies the initial zip offset.
+ // This is useful when the zip is appended to other data such as a binary executable.
+ Offset int64
+}
+
// NewWriter returns a new Writer writing a zip file to w.
func NewWriter(w io.Writer) *Writer {
- return &Writer{cw: &countWriter{w: bufio.NewWriter(w)}}
+ return NewWriterWithOptions(w, nil)
+}
+
+// NewWriterWithOptions returns a new Writer writing a zip file to w and uses the given options.
+func NewWriterWithOptions(w io.Writer, options *WriterOptions) *Writer {
+ writer := &Writer{
+ cw: &countWriter{
+ w: bufio.NewWriter(w),
+ },
+ }
+ if options != nil {
+ writer.cw.count = options.Offset
+ }
+ return writer
}
// Flush flushes any buffered data to the underlying writer.
}
}
+func TestWriterOffsetOption(t *testing.T) {
+ largeData := make([]byte, 1<<17)
+ for i := range largeData {
+ largeData[i] = byte(rand.Int())
+ }
+ writeTests[1].Data = largeData
+ defer func() {
+ writeTests[1].Data = nil
+ }()
+
+ // write a zip file
+ buf := new(bytes.Buffer)
+ existingData := []byte{1, 2, 3, 1, 2, 3, 1, 2, 3}
+ n, _ := buf.Write(existingData)
+ w := NewWriterWithOptions(buf, &WriterOptions{Offset: int64(n)})
+
+ for _, wt := range writeTests {
+ testCreate(t, w, &wt)
+ }
+
+ if err := w.Close(); err != nil {
+ t.Fatal(err)
+ }
+
+ // read it back
+ r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
+ if err != nil {
+ t.Fatal(err)
+ }
+ for i, wt := range writeTests {
+ testReadFile(t, r.File[i], &wt)
+ }
+}
+
func TestWriterFlush(t *testing.T) {
var buf bytes.Buffer
w := NewWriter(struct{ io.Writer }{&buf})