5.压缩文件读写
最后更新于:2022-04-02 04:46:00
import "archive/tar"
tar包实现了tar格式压缩文件的存取。本包目标是覆盖大多数tar的变种,包括GNU和BSD生成的tar文件。
tar.gz 文件写入:
~~~
func NewWriter(w io.Writer) *Writer
// NewWriter创建一个写入w的*Writer。
func FileInfoHeader(fi os.FileInfo, link string) (*Header, error)
/*
FileInfoHeader返回一个根据fi填写了部分字段的Header。
如果fi描述一个符号链接,FileInfoHeader函数将link参数作为链接目标。
如果fi描述一个目录,会在名字后面添加斜杠。
因为os.FileInfo接口的Name方法只返回它描述的文件的无路径名,有可能需要将返回值的Name字段修改为文件的完整路径名。
*/
func (tw *Writer) WriteHeader(hdr *Header) error
/*
WriteHeader写入hdr并准备接受文件内容。如果不是第一次调用本方法,会调用Flush。
在Close之后调用本方法会返回ErrWriteAfterClose。
*/
func (tw *Writer) Write(b []byte) (n int, err error)
/*
Write向tar档案文件的当前记录中写入数据。
如果写入的数据总数超出上一次调用WriteHeader的参数hdr.Size字节,返回ErrWriteTooLong错误。
*/
func (tw *Writer) Flush() error
// Flush结束当前文件的写入。(可选的)
func (tw *Writer) Close() error
// Close关闭tar档案文件,会将缓冲中未写入下层的io.Writer接口的数据刷新到下层。
~~~
代码实现:
~~~
package main
import (
"archive/tar"
"fmt"
"os"
)
func main() {
fileName := "./file.tar.gz"
insertByte := []byte("this is test tar weite.")
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
fmt.Printf("open file ./file.tar.gz err : %v\n", err)
}
if file != nil {
defer func(file *os.File) { file.Close() }(file)
}
write := tar.NewWriter(file)
fileInfo, err := os.Stat(fileName)
if err != nil {
fmt.Printf("os stat err : %v\n", err)
}
hdr, err := tar.FileInfoHeader(fileInfo, "")
if err != nil {
fmt.Printf("tar FileInfoHeader err : %v\n", err)
} else {
fmt.Printf("hdr.Size is %v \n", hdr.Size)
hdr.Size = int64(len(insertByte))
}
err = write.WriteHeader(hdr)
if err != nil {
fmt.Printf("write WriteHeader err : %v\n", err)
}
ret, err := write.Write(insertByte)
if err != nil {
fmt.Printf("write ./file.tar.gz err : %v\n", err)
} else {
fmt.Printf("write ./file.tar.gz success . return number is %d \n", ret)
}
err = write.Flush()
if err != nil {
fmt.Printf("write flush err : %v\n", err)
}
err = write.Close()
if err != nil {
fmt.Printf("write close err : %v\n", err)
}
}
~~~
tar.gz 文件读取:
~~~
func NewReader(r io.Reader) *Reader
// NewReader创建一个从r读取的Reader。
func (tr *Reader) Next() (*Header, error)
// 转入tar档案文件下一记录,它会返回下一记录的头域。
func (tr *Reader) Read(b []byte) (n int, err error)
// 从档案文件的当前记录读取数据,到达记录末端时返回(0, EOF),直到调用Next方法转入下一记录。
~~~
代码实现:
~~~
package main
import (
"archive/tar"
"fmt"
"os"
)
func main() {
fileName := "./file.tar.gz"
file, err := os.Open(fileName)
if err != nil {
fmt.Printf("open file ./file.tar.gz err : %v\n", err)
}
if file != nil {
defer func(file *os.File) { file.Close() }(file)
}
read := tar.NewReader(file)
hdr, err := read.Next()
var getByte = make([]byte, hdr.Size)
_, err = read.Read(getByte)
if err != nil {
fmt.Printf("read err : %v\n", err)
}
fmt.Println(string(getByte))
}
~~~
import "compress/flate"
flate包实现了deflate压缩数据格式。gzip包和zlib包实现了对基于deflate的文件格式的访问。
import "compress/gzip"
gzip包实现了gzip格式压缩文件的读写
import "compress/zlib"
zlib包实现了对zlib格式压缩数据的读写
';