Golang 从zip文件中读取并打印所有文件

Golang 从zip文件中读取并打印所有文件

Golang有一些包,如os、io和archive/zip,可以用来读取和打印压缩文件中的所有文件。zip文件是一组文件/文件夹的压缩集合。OS包用于执行复制操作,io包用于读写操作,而archive/zip包用于解压和压缩文件。在本文中,我们将学习如何使用这些包执行文件的复制和解压缩,并将其打印出来。

方法1:使用io和os包

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

语法

zip.OpenReader

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

步骤

  • 步骤1 - 在程序中创建一个main包并声明fmt(格式化包),os和io包,其中main生成可执行代码,fmt用于格式化输入和输出。

  • 步骤2 - 在主菜单中使用zip打开zip文件。使用OpenReader函数,将输出放入变量read中。如果存在问题,则打印错误消息,然后重试。为了在函数完成时自动关闭,使用defer语句在read上调用Close方法。

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

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

  • 步骤5 - 使用关闭语句和defer关键字在循环完成后确保v自动关闭。

  • 步骤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函数中创建一个main包,并声明fmt(格式化包)、archive/zip和io/ioutil包,其中main生成可执行代码,fmt用于格式化输入和输出。

  • 第2步 - 在主菜单中使用zip来打开zip文件。使用OpenReader函数,然后将输出放入变量read中。如果出现问题,则打印错误消息并重试,以便在函数完成时自动关闭,使用defer语句在read上调用Close方法。

  • 第3步 - 使用range循环和read.File字段遍历zip包中的文件。

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

  • 第5步 - 使用延迟调用将Close函数放在循环结束后自动关闭v。

  • 第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包来执行该程序。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程