
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Read and Print All Files from Zip File in Go
Golang has packages like os, io, and Archie/zip that can be used to read and print all the files from a zipped file. A zip file is a compressed collection of a set of files/folders. The OS package is used for performing copy operations, the io pacakge is for reading and writing operations whereas the archive/zip package is for unzipping and zipping the file. In this article, we are going to learn about using all these packages to perform the copy and unzipping of the files and printing the same.
Method 1: Using io and os package
This program uses the archive/zip package to read a zip file's contents. It opens the zip file using the zip.OpenReader function, which returns a zip.ReadCloser type. Then, it uses a range loop to cycle over all of the files in the archive, uses the Open method to open each file, and print the file name and contents to the standard output.
Syntax
zip.OpenReader
This function belongs to the archive/zip package. The primary focus of this function is to open and read the contents of a zip file. It takes only one input i.e. the zip file.
Algorithm
Step 1 ? Create a package main and declare fmt(format package), os and io package in the program where main produces executable codes and fmt helps in formatting input and output.
Step 2 ? Use the zip to open the zip file in the main menu. Use the OpenReader function, then put the output in the variable read. Print the error message and then retry if a problem exists. So that it closes automatically when the function completes, defer the Close method on read.
Step 3 ? Use a range loop and the read.File field to iterate through the files in the zip package.
Step 4 ? Then, Use the Open method to open the current file at each iteration, then save the outcome to the variable v. Print the error message and then retry if a problem exists.
Step 5 ? To ensure that v is automatically closed after the loop is finished, use the close statement and defer keyword on v.
Step 6 ? Print the filename using printf, using the Name field of the zip.File type, and io.Copy to copy the contents of v to the output.
Step 7 ? If an error comes while printing the file name, print the error on the console.
Example
In this example, we will use io and os package functions to execute the program.
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() } }
Output
File1.txt File2.txt
Method 2: Using archive/zip and io/ioutil package
This program is very similar to last example as it reads the contents of the file into a []byte slice using the io/ioutil package, which is then displayed to the standard output using fmt.Printf.
Syntax
ioutil.ReadAll
This function belongs to the ioutil package. The main motive to use it is to read the contents of a file into a byte slice. It takes the filename as an input.
Algorithm
Step 1 ? Create a package main and declare fmt(format package), archice/zip and io/ioutil package in the program where main produces executable codes and fmt helps in formatting input and output.
Step 2 ? Use the zip to open the zip file in the main menu. Use the OpenReader function, then put the output in the variable read. Print the error message and then retry if a problem exists so that it closes automatically when the function completes, defer the Close method on read.
Step 3 ? Use a range loop and the read.File field to iterate through the files in the zip package.
Step 4 ? Use the Open method to open the current file at each iteration, then save the outcome to the variable v. Print the error message and then retry if a problem exists.
Step 5 ? To ensure that v is automatically closed after the loop is finished, postpone the Close function on v.
Step 6 ? Use the ioutil.ReadAll function to read the file's content and put the output of the into the variable b. If an error exists print it on the console.
Step 7 ? Then, print the file name and its contents using printf, using the Name field of the zip.File type and print the contents of file stored in slice b.
Example
In this example we will use io/ioutil and archive/zip package to execute the program.
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)) } }
Output
File1.txt File2.txt
Conclusion
We executed the program of reading and printing the files from zip file using two methods. In the first method we used io and os package and in the second method we used archive/zip and io/ioutil package to execute the program.