golang标准包分析—archive


zip

使用方法

// 写到文件中
src,err :=  os.Create("/name.zip")
if err != nil{
    return 
}
w := zip.NewWriter(src)
// 给写入的文件写名字,Create()函数,默认的压缩方式是deflate,需要选择压缩方式可以用CreateHeader()
//  Store   uint16 = 0 // no compression
//  Deflate uint16 = 8 // DEFLATE compressed
f,err := w.Create("name")
if err != nil{
    return
}
//将内容写入相应的文件中,data是二进制字节流
_,err:=f.write(data)
if err != nil {
    return 
}
// 写完后,需要注意关闭w
w.Close()
err := w.Close()
if err != nil {
    log.Fatal(err)
}

读(常用就是解压缩)

// OpenReader 打开要读取的zip,path:zip文件路径
rc ,err := zip.OpenReader(Path)
if err == nil {
    defer rc.Close()
}
for _f,:= range rc.File{
    rc,err := f.Open()
    if err != nil{
        return
    }
    //创建新的文件用来接收数据
    f,err := os.Create("./")
    if err != nil{
        return
    }
    defer f.Close()
    _,err := io.Copy(f,rc)
    if err != nil{
        return 
    }

}

源码分析

源码太牛了,慢慢解读中

tar

使用方法

    f, err := os.Create("tarr.tar")
    if err != nil {
        log.Fatal(3, err)
    }
    defer f.Close()
    wt := tar.NewWriter(f)
    defer wt.Close()
    write(wt, "readme.txt")
    write(wt, "todo.txt")

    // tw tar.Writer的指针对象,name 需要进入压缩包的文件
func write(tw *tar.Writer, name string) {
    //读取文件信息
    of, err := os.Open(name)
    if err != nil {
        log.Fatal(err)
    }
    defer of.Close()
    info, err := of.Stat()
    if err != nil {
        log.Fatal(err)
    }
    head, err := tar.FileInfoHeader(info, "")
    if err != nil {
        log.Fatal(err)
    }
    tw.WriteHeader(head)
    _, err = io.Copy(tw, of)
    if err != nil {
        log.Fatal(1, err)
    }
}

解压缩

f, err := os.Open("tarr.tar")
if err != nil {
    log.Fatal(err)
}
defer f.Close()
tr := tar.NewReader(f)
for {
    head, err := tr.Next()
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
    fi := head.FileInfo()
    f, err := os.Create(fi.Name())
    if err != nil {
        log.Fatal(err)
    }
    io.Copy(f, tr)
    os.Chmod(fi.Name(), fi.Mode().Perm())
    f.Close()
}

源码分析

源码太牛了,慢慢解读中