Files
obitools4/pkg/obiutils/gzipfile.go
Eric Coissac d5e84ec676 rename goutils to obiutils
Former-commit-id: 2147f53db972bba571dfdae30c51b62d3e69cec5
2023-03-24 10:25:12 +07:00

102 lines
1.5 KiB
Go

package obiutils
import (
"bufio"
"compress/gzip"
"io"
"os"
)
type Wfile struct {
compressed bool
close bool
out io.WriteCloser
gf *gzip.Writer
fw *bufio.Writer
}
func OpenWritingFile(name string, compressed bool, append bool) (*Wfile, error) {
flags := os.O_WRONLY | os.O_CREATE
if append {
flags |= os.O_APPEND
}
fi, err := os.OpenFile(name, flags, 0660)
if err != nil {
return nil, err
}
var gf *gzip.Writer
var fw *bufio.Writer
if compressed {
gf = gzip.NewWriter(fi)
fw = bufio.NewWriter(gf)
} else {
gf = nil
fw = bufio.NewWriter(fi)
}
return &Wfile{
compressed: compressed,
close: true,
out: fi,
gf: gf,
fw: fw,
}, nil
}
func CompressStream(out io.WriteCloser, compressed bool, close bool) (*Wfile, error) {
var gf *gzip.Writer
var fw *bufio.Writer
if compressed {
gf = gzip.NewWriter(out)
fw = bufio.NewWriter(gf)
} else {
gf = nil
fw = bufio.NewWriter(out)
}
return &Wfile{
compressed: compressed,
close: close,
out: out,
gf: gf,
fw: fw,
}, nil
}
func (w *Wfile) Write(p []byte) (n int, err error) {
return w.fw.Write(p)
}
func (w *Wfile) WriteString(s string) (n int, err error) {
return w.fw.Write([]byte(s))
}
func (w *Wfile) Close() error {
var err error
err = nil
w.fw.Flush()
if w.compressed {
err = w.gf.Close()
}
var err2 error
err2 = nil
if w.close {
err2 = w.out.Close()
}
if err == nil {
err = err2
}
return err
}