Cara Membuat Archive Zip di Golang

Cara Membuat Archive Zip di Golang

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

Cara Membuat Archive Zip di Golang
Cara Membuat Archive Zip di Golang

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.