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