Skip to content

Instantly share code, notes, and snippets.

@miku
Last active August 29, 2015 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miku/5c4bb366850fab41eee4 to your computer and use it in GitHub Desktop.
Save miku/5c4bb366850fab41eee4 to your computer and use it in GitHub Desktop.
Gzip file implementing the same methods as *os.File
package main
import (
"compress/gzip"
"errors"
"fmt"
"io/ioutil"
"log"
"os"
)
var errNotImplemented = errors.New("not implemented")
type File interface {
Chdir() error
Chmod(mode os.FileMode) error
Chown(uid, gid int) error
Close() error
Fd() uintptr
Name() string
Read(b []byte) (n int, err error)
ReadAt(b []byte, off int64) (n int, err error)
Readdir(n int) (fi []os.FileInfo, err error)
Readdirnames(n int) (names []string, err error)
Seek(offset int64, whence int) (ret int64, err error)
Stat() (fi os.FileInfo, err error)
Sync() (err error)
Truncate(size int64) error
Write(b []byte) (n int, err error)
WriteAt(b []byte, off int64) (n int, err error)
WriteString(s string) (ret int, err error)
}
type GzipFile struct {
file *os.File
reader *gzip.Reader
writer *gzip.Writer
}
func Open(path string) (*GzipFile, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
reader, err := gzip.NewReader(file)
if err != nil {
return nil, err
}
return &GzipFile{file, reader, nil}, nil
}
func Create(path string) (*GzipFile, error) {
file, err := os.Create(path)
if err != nil {
return nil, err
}
writer := gzip.NewWriter(file)
return &GzipFile{file, nil, writer}, nil
}
func (f *GzipFile) Chdir() error {
return f.file.Chdir()
}
func (f *GzipFile) Chmod(mode os.FileMode) error {
return f.file.Chmod(mode)
}
func (f *GzipFile) Chown(uid, gid int) error {
return f.file.Chown(uid, gid)
}
func (f *GzipFile) Close() error {
if f.writer != nil {
err := f.writer.Close()
if err != nil {
return err
}
}
if f.reader != nil {
err := f.reader.Close()
if err != nil {
return err
}
}
return f.file.Close()
}
func (f *GzipFile) Fd() uintptr {
return f.file.Fd()
}
func (f *GzipFile) Name() string {
return f.file.Name()
}
func (f *GzipFile) Read(b []byte) (n int, err error) {
return f.reader.Read(b)
}
func (f *GzipFile) ReadAt(b []byte, off int64) (n int, err error) {
return 0, errNotImplemented
}
func (f *GzipFile) Readdir(n int) (fi []os.FileInfo, err error) {
return nil, errNotImplemented
}
func (f *GzipFile) Readdirnames(n int) (names []string, err error) {
return nil, errNotImplemented
}
func (f *GzipFile) Seek(offset int64, whence int) (ret int64, err error) {
return 0, errNotImplemented
}
func (f *GzipFile) Stat() (fi os.FileInfo, err error) {
return nil, errNotImplemented
}
func (f *GzipFile) Sync() (err error) {
return f.file.Sync()
}
func (f *GzipFile) Truncate(size int64) error {
return f.file.Truncate(size)
}
func (f *GzipFile) Write(b []byte) (n int, err error) {
return f.writer.Write(b)
}
func (f *GzipFile) WriteAt(b []byte, off int64) (n int, err error) {
return 0, errNotImplemented
}
func (f *GzipFile) WriteString(s string) (ret int, err error) {
return f.writer.Write([]byte(s))
}
func main() {
file, err := Create("/tmp/12345")
if err != nil {
log.Fatal(err)
}
file.WriteString("Hello World\n")
file.Close()
file, err = Open("/tmp/12345")
if err != nil {
log.Fatal(err)
}
content, err := ioutil.ReadAll(file)
if err != nil {
log.Fatal(err)
}
fmt.Print(string(content))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment