Go语言压缩文件读写

Posted Go程序员开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言压缩文件读写相关的知识,希望对你有一定的参考价值。

Go语言压缩文件读写

压缩文件读写

tar包实现了tar格式压缩文件的存取。本包目标是覆盖大多数tar的变种,包括GNU和BSD生成的tar文件。

压缩文件读写常用函数和方法:

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接口的数据刷新到下层。

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方法转入下一记录。

tar.gz 文件写入,代码实现:

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 文件读取,代码实现:

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))

}

其它压缩文件操作

compress/flate 包实现了deflate压缩数据格式。gzip包和zlib包实现了对基于deflate的文件格式的访问。

compress/gzip 包实现了gzip格式压缩文件的读写。

compress/zlib 包实现了对zlib格式压缩数据的读写。

下一篇:

Go语言文件操作应用------敬请期待!


第十一章 并发编程

   11.1    

   11.2    

   11.3    

   11.4    

第十二章 反射

   12.1    

   12.2    

第十三章 数据格式

   13.1    

   13.2    

第十四章 终端读取

   14.1    

   14.2    

第十五章 文件操作

   15.1    

   15.2    

   15.3    

   15.4    


自2017年6月起,老男孩IT教育就顺应技术发展潮流开设了Go语言开发课程,以帮助更多有需要的盆友们提升技能,若是想要了解具体课程内容的话,那就点击本文左下方“阅读原文”来咨询吧~


看完本文有收获?那就分享给更多人吧

以上是关于Go语言压缩文件读写的主要内容,如果未能解决你的问题,请参考以下文章

使用go语言绕过page cache读写文件

Golang✔️走进 Go 语言✔️ 第二十二课 json & 文件读写

Golang✔️走进 Go 语言✔️ 第二十二课 json & 文件读写

go语言基础-文件读写操作

go语言读写文件的几种方式

Go语言的文件操作:文件的读写,文件的新建打开和删除