Welcome to our deep dive into the archive/zip package in Go! This tutorial is designed for both beginners and intermediates, so let's get started. By the end of this lesson, you'll be able to create, read, and write zip archives with ease.
An archive or zip file is a collection of one or more files that are saved in a single compressed file. This compression helps in saving storage space and makes file transfer easier. In Go, we use the archive/zip package to work with zip archives.
The archive/zip package is part of the standard library in Go, so you don't need to install it separately. To use it, simply import it in your Go code:
import (
"archive/zip"
"io"
"os"
)Let's create a simple zip archive containing two files: file1.txt and file2.txt.
package main
import (
"archive/zip"
"fmt"
"io"
"os"
)
func main() {
// Create a new file in the zip archive
file, err := zip.FileInfoHeader({
Name: "file1.txt",
FileTime: time.Now(),
})
if err != nil {
fmt.Println(err)
return
}
file.File, err = os.Create("file1.txt")
if err != nil {
fmt.Println(err)
return
}
// Repeat the process for file2.txt
file2, err := zip.FileInfoHeader({
Name: "file2.txt",
FileTime: time.Now(),
})
if err != nil {
fmt.Println(err)
return
}
file2.File, err = os.Create("file2.txt")
if err != nil {
fmt.Println(err)
return
}
// Create a new zip file
zipFile, err := os.Create("my_archive.zip")
if err != nil {
fmt.Println(err)
return
}
defer zipFile.Close()
// Write the files to the zip archive
archiveWriter := zip.NewWriter(zipFile)
defer archiveWriter.Close()
err = file.WriteZIP(archiveWriter)
if err != nil {
fmt.Println(err)
return
}
err = file2.WriteZIP(archiveWriter)
if err != nil {
fmt.Println(err)
return
}
}In this example, we first create two files (file1.txt and file2.txt) and then create a new zip archive named my_archive.zip. The WriteZIP function writes the files to the zip archive.
Now, let's read the zip archive we created earlier:
package main
import (
"archive/zip"
"fmt"
"log"
"os"
)
func main() {
// Open the zip file
zipFile, err := zip.OpenReader("my_archive.zip")
if err != nil {
log.Fatal(err)
}
defer zipFile.Close()
// Iterate through each file in the zip archive
for _, file := range zipFile.File {
// Open the file within the zip archive
fileReader, err := file.Open()
if err != nil {
log.Fatal(err)
}
defer fileReader.Close()
// Read the contents of the file
data, err := io.ReadAll(fileReader)
if err != nil {
log.Fatal(err)
}
// Print the file name and contents
fmt.Printf("File: %s\nData: %s\n", file.Name, data)
}
}In this example, we open the zip file and iterate through each file within it. We open the file within the archive, read its contents, and print the file name and contents.
Writing to a zip archive involves creating a new file, adding it to the archive, and then updating the archive. Here's an example:
package main
import (
"archive/zip"
"fmt"
"io"
"os"
)
func main() {
// Create a new file in the zip archive
file, err := zip.FileInfoHeader({
Name: "new_file.txt",
FileTime: time.Now(),
})
if err != nil {
fmt.Println(err)
return
}
file.File, err = os.Create("new_file.txt")
if err != nil {
fmt.Println(err)
return
}
// Open the existing zip file
zipFile, err := zip.OpenWriter("my_archive.zip")
if err != nil {
fmt.Println(err)
return
}
defer zipFile.Close()
// Add the new file to the archive
err = file.WriteZIP(zipFile)
if err != nil {
fmt.Println(err)
return
}
// Update the zip archive
zipFile.Close()
os.Rename("my_archive.zip", "updated_archive.zip")
}In this example, we create a new file (new_file.txt) and add it to an existing zip archive (my_archive.zip). We then rename the updated archive to updated_archive.zip.
What is the main purpose of the `archive/zip` package in Go?
That's it for our comprehensive guide on Go's archive/zip package! You now have the knowledge to create, read, and write zip archives in your Go projects. Happy coding! 🚀