Go语言程序读取并打印zip文件中的所有文件


Go语言拥有os、io和archive/zip等包,可用于读取和打印zip文件中的所有文件。zip文件是一组文件/文件夹的压缩集合。OS包用于执行复制操作,io包用于读取和写入操作,而archive/zip包用于解压缩和压缩文件。本文将学习如何使用所有这些包来执行文件的复制和解压缩,并打印文件内容。

方法1:使用io和os包

此程序使用archive/zip包读取zip文件的内容。它使用zip.OpenReader函数打开zip文件,该函数返回zip.ReadCloser类型。然后,它使用范围循环遍历存档中的所有文件,使用Open方法打开每个文件,并将文件名和内容打印到标准输出。

语法

zip.OpenReader

此函数属于archive/zip包。此函数的主要目的是打开并读取zip文件的内容。它只接受一个输入,即zip文件。

算法

  • 步骤1 − 创建一个名为main的包,并在程序中声明fmt(格式化包)、os和io包,其中main生成可执行代码,fmt帮助格式化输入和输出。

  • 步骤2 − 在主菜单中使用zip打开zip文件。使用OpenReader函数,然后将输出放入变量read中。如果存在问题,打印错误消息并重试。以便在函数完成时自动关闭,推迟read上的Close方法。

  • 步骤3 − 使用范围循环和read.File字段迭代zip包中的文件。

  • 步骤4 − 然后,使用Open方法在每次迭代时打开当前文件,然后将结果保存到变量v中。如果存在问题,打印错误消息并重试。

  • 步骤5 − 为了确保在循环结束后自动关闭v,在v上使用close语句和defer关键字。

  • 步骤6 − 使用printf打印文件名,使用zip.File类型的Name字段,并使用io.Copy将v的内容复制到输出。

  • 步骤7 − 如果在打印文件名时出现错误,则在控制台上打印错误。

示例

在本例中,我们将使用io和os包函数来执行程序。

package main
import (
   "archive/zip"
   "fmt"
   "io"
   "os"
)

func main() {
   // Open the zip file
   read, err := zip.OpenReader("folder.zip")
   if err != nil {
      fmt.Println(err)
      return
   }
   defer read.Close()

   // Iterate through the files in the zip archive
   for _, f := range read.File {
      // Open the current file
      v, err := f.Open()
      if err != nil {
         fmt.Println(err)
         return
      }
      defer v.Close()

      // Print the file name and contents
      fmt.Printf("File Name: %s\n", f.Name)
      _, err = io.Copy(os.Stdout, v)
      if err != nil {
         fmt.Println(err)
         return
      }
      fmt.Println()
   }
}

输出

File1.txt
File2.txt

方法2:使用archive/zip和io/ioutil包

此程序与上一个示例非常相似,因为它使用io/ioutil包将文件的内容读入[]byte切片中,然后使用fmt.Printf将其显示到标准输出。

语法

ioutil.ReadAll 

此函数属于ioutil包。使用它的主要目的是将文件的内容读入字节切片中。它以文件名作为输入。

算法

  • 步骤1 − 创建一个名为main的包,并在程序中声明fmt(格式化包)、archice/zip和io/ioutil包,其中main生成可执行代码,fmt帮助格式化输入和输出。

  • 步骤2 − 在主菜单中使用zip打开zip文件。使用OpenReader函数,然后将输出放入变量read中。如果存在问题,打印错误消息并重试,以便在函数完成时自动关闭,推迟read上的Close方法。

  • 步骤3 − 使用范围循环和read.File字段迭代zip包中的文件。

  • 步骤4 − 使用Open方法在每次迭代时打开当前文件,然后将结果保存到变量v中。如果存在问题,打印错误消息并重试。

  • 步骤5 − 为了确保在循环结束后自动关闭v,推迟v上的Close函数。

  • 步骤6 − 使用ioutil.ReadAll函数读取文件的内容,并将输出放入变量b中。如果存在错误,则在控制台上打印它。

  • 步骤7 − 然后,使用printf打印文件名及其内容,使用zip.File类型的Name字段,并打印存储在切片b中的文件内容。

示例

在本例中,我们将使用io/ioutil和archive/zip包来执行程序。

package main
import (
   "archive/zip"
   "fmt"
   "io/ioutil"
)

func main() {
   // Open the zip file
   read, err := zip.OpenReader("sample.zip")
   if err != nil {
      fmt.Println(err)
      return
   }
   defer read.Close()

   // Iterate through the files in the zip archive
   for _, f := range read.File {
      // Open the current file
      v, err := f.Open()
      if err != nil {
         fmt.Println(err)
         return
      }
      defer v.Close()

      // Read the contents of the file
      b, err := ioutil.ReadAll(v)
      if err != nil {
         fmt.Println(err)
         return
      }

      // Print the file name and contents
      fmt.Printf("File Name: %s\n", f.Name)
      fmt.Printf("%s\n", string(b))
   }
}

输出

File1.txt
File2.txt

结论

我们使用两种方法执行了读取和打印zip文件中的文件的程序。在第一种方法中,我们使用了io和os包,在第二种方法中,我们使用了archive/zip和io/ioutil包来执行程序。

更新于: 2023年2月22日

2K+ 次查看

启动你的 职业生涯

通过完成课程获得认证

开始
广告