Golang的archive打包解包 tar/zip实现

Go语言通过archive/tar和archive/zip实现打包与解压,tar保留元信息适用于Linux备份,zip跨平台支持好适合分发,可结合gzip压缩,处理大文件需注意流式操作。

golang的archive打包解包 tar/zip实现

Go语言标准库中的 archive/tararchive/zip 包提供了对 tar 和 zip 格式文件的打包与解包支持。下面分别介绍如何使用它们实现常见的压缩与解压操作。

tar 打包与解包

tar 是 Unix 系统中常用的归档格式,不压缩但能保留目录结构和文件元信息(如权限、时间戳)。

1. tar 打包(归档)

将多个文件或目录归档为一个 .tar 文件:

package mainimport (    "archive/tar"    "os"    "path/filepath")func tarFiles(srcDir, tarFile string) error {    f, err := os.Create(tarFile)    if err != nil {        return err    }    defer f.Close()    tw := tar.NewWriter(f)    defer tw.Close()    return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {        if err != nil {            return err        }        header, err := tar.FileInfoHeader(info, "")        if err != nil {            return err        }        // 修正 header 中的 Name,使用相对路径        relPath, _ := filepath.Rel(srcDir, path)        header.Name = filepath.ToSlash(relPath)        if !info.IsDir() {            tw.WriteHeader(header)            data, _ := os.Open(path)            defer data.Close()            io.Copy(tw, data)        } else {            tw.WriteHeader(header)        }        return nil    })}

2. tar 解包(提取)

从 .tar 文件中提取内容:

立即学习“go语言免费学习笔记(深入)”;

func untar(tarFile, dest string) error {    f, err := os.Open(tarFile)    if err != nil {        return err    }    defer f.Close()    tr := tar.NewReader(f)    for {        header, err := tr.Next()        if err == io.EOF {            break        }        if err != nil {            return err        }        target := filepath.Join(dest, header.Name)        switch header.Typeflag {        case tar.TypeDir:            os.MkdirAll(target, 0755)        case tar.TypeReg:            os.MkdirAll(filepath.Dir(target), 0755)            outFile, _ := os.Create(target)            io.Copy(outFile, tr)            outFile.Close()        }    }    return nil}

zip 打包与解包

zip 是跨平台常用的压缩归档格式,支持压缩和目录结构。

1. zip 打包(压缩)

将文件夹压缩为 .zip 文件:

import (    "archive/zip"    "io"    "path/filepath")func zipFiles(srcDir, zipFile string) error {    f, err := os.Create(zipFile)    if err != nil {        return err    }    defer f.Close()    zw := zip.NewWriter(f)    defer zw.Close()    return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {        if err != nil {            return err        }        relPath := filepath.ToSlash(filepath.Rel(srcDir, path))        if info.IsDir() {            _, err := zw.Create(relPath + "/")            return err        }        writer, err := zw.Create(relPath)        if err != nil {            return err        }        file, _ := os.Open(path)        defer file.Close()        io.Copy(writer, file)        return nil    })}

2. zip 解包(解压)

从 .zip 文件中提取内容:

func unzip(zipFile, dest string) error {    r, err := zip.OpenReader(zipFile)    if err != nil {        return err    }    defer r.Close()    for _, file := range r.File {        filePath := filepath.Join(dest, file.Name)        if file.FileInfo().IsDir() {            os.MkdirAll(filePath, 0755)            continue        }        if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil {            return err        }        f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())        if err != nil {            return err        }        rc, _ := file.Open()        io.Copy(f, rc)        f.Close()        rc.Close()    }    return nil}

使用建议

tar 适合保留文件权限和时间戳,常用于 Linux 环境下的备份。 zip 更适合跨平台分发,Windows 原生支持好。 如需压缩,可结合 compress/gzip 使用 tar.gz(即 tar + gzip 压缩)。 处理大文件时注意流式读写,避免内存溢出。基本上就这些。Go 的 archive 包设计简洁,配合 os 和 filepath 使用非常方便。

以上就是Golang的archive打包解包 tar/zip实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1399176.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Google TV 配对协议中的 SSL 握手失败与 Go 语言客户端证书处理
上一篇 2025年12月15日 15:59:56
Golang预防Web攻击怎么做 SQL注入/XSS防护方案
下一篇 2025年12月15日 16:00:07

相关推荐

发表回复

登录后才能评论
关注微信