- Beranda /
- Daftar Artikel /
- Cara Membuat Archive Zip di Golang
Cara Membuat Archive Zip di Golang
- Ade Dwi Putra
- Golang
- 26 Januari 2024
Daftar Isi
Pada tutorial di JadiFullstack kali ini, kita akan mempelajari bagaimana cara membuat archive atau melakukan zip di golang.
Pendahuluan
Membuat file archive atau biasa yang sering kita sebut mengompres sebuah files adalah sesuatu yang sering kita lakukan untuk membuat files menjadi satu agar lebih ringan atau ketika kita ingin menggabungkan beberapa file menjadi satu file untuk pengiriman data.
Dalam tutorial ini, kita akan belajar cara membuat archive zip menggunakan bahasa pemrograman Golang.
Buat Project Baru
Persiapan pertama yang kita lakukan adalah membuat project baru untuk memudahkan kita dalam belajar. Saya akan membuat struktur foldernya seperti ini
membuat-zip
-main.go
-files
--report1.txt
--report2.csv
-zipped
Folder root project kita bernama membuat-zip
kemudian di dalamnya teradapat folder files
yang berisikan file yang mau kita archive. Selanjutnya ada folder zipped
tempat untuk menyimpan hasil archive kita.
Hasilnya akan terlihat seperti gambar di bawah ini
membuat Fungsi zip folder
Setelah kita membuat sebuah function untuk melakukan zip folder. Kita memisahkan fungsinya dari main agar kode kita lebih rapi dan bersih. Berikut adalah kode fungsi zip foldernya
// fungsi zipFolder untuk membuat zip dari folder
// param 1: folderPath adalah path folder yang ingin di archive
// param 2: zipFilePath adalah path folder dan nama file hasil archive zip
// return error jika terjadi error
func zipFolder(folderPath, zipFilePath string) error {
// membuat file zip di folder hasil archive
fmt.Println("memulai membuat zip file...")
zipFile, err := os.Create(zipFilePath)
if err != nil {
return fmt.Errorf("failed to create zip file: %w", err)
}
defer zipFile.Close()
// membuat zip writer untuk menulis file zip
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// membaca isi folder yanbg ingin di archive
files, err := os.ReadDir(folderPath)
if err != nil {
return fmt.Errorf("failed to read folder: %w", err)
}
// looping file di folder dan menambahkan file ke zip
for _, file := range files {
// membuat path file yang akan di zip
filePath := filepath.Join(folderPath, file.Name())
// buka file yang ingin di zip
fmt.Println("membuka file: ", filePath)
file, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
// Buat file baru di zip archive
fmt.Println("menambahkan file ke zip: ", file.Name())
writer, err := zipWriter.Create(file.Name())
if err != nil {
return fmt.Errorf("failed to create entry in zip file: %w", err)
}
// copy isi file ke zip archive
fmt.Println("menyalin isi file ke zip: ", file.Name())
if _, err := io.Copy(writer, file); err != nil {
return fmt.Errorf("failed to copy file content to zip: %w", err)
}
}
fmt.Println("zip file berhasil dibuat: ", zipFilePath)
return nil
}
Kalian bisa membaca penjelasan kode di komentar yang sudah saya tambahkan. Silahkan coba pahami kodenya untuk melatih kemampuan perograming kalian.
membuat Fungsi main
Selanjutnya kita tinggal membuat fungsi main untuk memanggil fungsi folder zip yang telah kita buatkan tadi. Berikut adalah kodenya
func main() {
// path folder yang ingin di archive zip
folderPath := "./files"
// path folder dan nama file hasil archive zip
zipFilePath := "./zipped/files.zip"
// memanggil fungsi zipFolder
if err := zipFolder(folderPath, zipFilePath); err != nil {
fmt.Printf("Failed to zip folder: %v\n", err)
}
}
Kode lengkap membuat archive zip
Berikut ini adalah kode lengkap di file main.go untuk membuat archive zip di golang. Setelah kalian menulis kode lengkapnya silahkan jalankan programnya dengan perintah go run main.go
Kemudian lihat di folder zipped untuk melihat hasil kompress dari program yang telah kita buat.
package main
import (
"archive/zip"
"fmt"
"io"
"os"
"path/filepath"
)
func main() {
// path folder yang ingin di archive zip
folderPath := "./files"
// path folder dan nama file hasil archive zip
zipFilePath := "./zipped/files.zip"
// memanggil fungsi zipFolder
if err := zipFolder(folderPath, zipFilePath); err != nil {
fmt.Printf("Failed to zip folder: %v\n", err)
}
}
// funsi zipFolder untuk membuat zip dari folder
// param 1: folderPath adalah path folder yang ingin di archive
// param 2: zipFilePath adalah path folder dan nama file hasil archive zip
// return error jika terjadi error
func zipFolder(folderPath, zipFilePath string) error {
// membuat file zip di folder hasil archive
fmt.Println("memulai membuat zip file...")
zipFile, err := os.Create(zipFilePath)
if err != nil {
return fmt.Errorf("failed to create zip file: %w", err)
}
defer zipFile.Close()
// membuat zip writer untuk menulis file zip
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// membaca isi folder yanbg ingin di archive
files, err := os.ReadDir(folderPath)
if err != nil {
return fmt.Errorf("failed to read folder: %w", err)
}
// looping file di folder dan menambahkan file ke zip
for _, file := range files {
// membuat path file yang akan di zip
filePath := filepath.Join(folderPath, file.Name())
// buka file yang ingin di zip
fmt.Println("membuka file: ", filePath)
file, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
// Buat file baru di zip archive
fmt.Println("menambahkan file ke zip: ", file.Name())
writer, err := zipWriter.Create(file.Name())
if err != nil {
return fmt.Errorf("failed to create entry in zip file: %w", err)
}
// copy isi file ke zip archive
fmt.Println("menyalin isi file ke zip: ", file.Name())
if _, err := io.Copy(writer, file); err != nil {
return fmt.Errorf("failed to copy file content to zip: %w", err)
}
}
fmt.Println("zip file berhasil dibuat: ", zipFilePath)
return nil
}
Selamat mencobam jangan ragu untuk meninggalkan komentar jika masih bingung, terima kasih.