登录
首页 >  Golang >  Go教程

Golang文件压缩解压教程详解

时间:2025-09-28 17:02:28 187浏览 收藏

本文详细介绍了如何在 Golang 中使用 `archive/zip` 包实现文件的压缩与解压功能,无需依赖第三方库。通过 `os.Open`、`os.Create`、`zip.NewWriter` 和 `zip.OpenReader` 等函数,我们可以轻松地将文件压缩成 ZIP 格式,以及从 ZIP 包中提取文件。文章提供了完整的代码示例,包括 `compressFile` 函数用于压缩文件,`decompressFile` 函数用于解压文件,并详细解释了每个步骤的实现原理,例如设置 Deflate 压缩方式、创建 ZIP 头信息以及处理目录和文件条目。最后,通过一个简单的 `main` 函数演示了如何调用这些函数完成 `test.txt` 文件的压缩和解压操作,并提醒读者注意文件存在性和目录可写性,帮助开发者快速掌握 Golang 文件压缩解压的技巧。

Go语言通过archive/zip包实现文件压缩与解压。1. 压缩:使用os.Open读取源文件,os.Create创建ZIP文件,zip.NewWriter写入数据,设置Deflate压缩方式并复制文件内容。2. 解压:zip.OpenReader读取ZIP包,遍历文件条目,根据是否为目录创建对应路径或写入文件,io.Copy完成数据提取。3. 示例中compressFile将test.txt压缩为output.zip,decompressFile将其解压到extracted目录。4. 注意确保源文件存在且目标目录可写。5. 标准库功能完备,无需第三方依赖即可满足常规需求。

Golang 文件压缩解压功能实现示例

Go语言提供了丰富的标准库来处理文件的压缩与解压,主要通过 archive/zip 包实现 ZIP 格式的支持。下面是一个完整的示例,展示如何在 Golang 中实现文件的压缩与解压功能。

压缩文件(创建 ZIP)

使用 archive/ziposio 等包可以将一个或多个文件打包成 ZIP 压缩包。

func compressFile(filename, zipPath string) error {
  file, err := os.Open(filename)
  if err != nil {
    return err
  }
  defer file.Close()

  info, err := file.Stat()
  if err != nil {
    return err
  }

  zipfile, err := os.Create(zipPath)
  if err != nil {
    return err
  }
  defer zipfile.Close()

  zipWriter := zip.NewWriter(zipfile)
  defer zipWriter.Close()

  header, err := zip.FileInfoHeader(info)
  if err != nil {
    return err
  }
  header.Name = filepath.Base(filename)
  header.Method = zip.Deflate

  writer, err := zipWriter.CreateHeader(header)
  if err != nil {
    return err
  }

  _, err = io.Copy(writer, file)
  if err != nil {
    return err
  }
  return nil
}

说明:

  • 打开目标文件并获取其元信息
  • 创建 ZIP 输出文件,并用 zip.NewWriter 初始化写入器
  • 为文件创建 ZIP 头信息,设置压缩方式为 Deflate
  • 将原始文件内容复制到 ZIP 中

解压文件(提取 ZIP)

从 ZIP 压缩包中读取并还原文件内容。

func decompressFile(zipPath, outputPath string) error {
  reader, err := zip.OpenReader(zipPath)
  if err != nil {
    return err
  }
  defer reader.Close()

  for _, file := range reader.File {
    rc, err := file.Open()
    if err != nil {
      return err
    }

    filePath := filepath.Join(outputPath, file.Name)
    if file.FileInfo().IsDir() {
      os.MkdirAll(filePath, os.ModePerm)
    } else {
      err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm)
      if err != nil {
        rc.Close()
        return err
      }

      outFile, err := os.Create(filePath)
      if err != nil {
        rc.Close()
        return err
      }

      _, err = io.Copy(outFile, rc)
      outFile.Close()
      rc.Close()
      if err != nil {
        os.Remove(filePath)
        return err
      }
    }
  }
  return nil
}

说明:

  • 使用 zip.OpenReader 打开 ZIP 文件
  • 遍历其中每个条目
  • 判断是否为目录,是则创建路径;否则写入文件内容
  • 确保资源及时关闭,避免泄漏

完整使用示例

你可以这样调用上述函数:

func main() {
  err := compressFile("test.txt", "output.zip")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("压缩完成")

  err = decompressFile("output.zip", "./extracted/")
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("解压完成")
}

注意:确保 test.txt 存在,并且 extracted 目录可写。

基本上就这些。Golang 的 zip 包足够应对大多数日常压缩需求,无需引入第三方库。

理论要掌握,实操不能落!以上关于《Golang文件压缩解压教程详解》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>