Skip to content

Instantly share code, notes, and snippets.

@42LM
Created September 9, 2025 11:44
Show Gist options
  • Select an option

  • Save 42LM/cf2dde1a03d15440b9ea4b2008514085 to your computer and use it in GitHub Desktop.

Select an option

Save 42LM/cf2dde1a03d15440b9ea4b2008514085 to your computer and use it in GitHub Desktop.
zip stuff
package main
import (
"archive/zip"
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
func main() {
if os.Args[1] == "c" {
createZipFile()
} else if os.Args[1] == "r" {
readZipFile()
} else {
fmt.Println("You wan what?")
}
}
func createZipFile() {
folderToZip := "foldername"
zipFile := "zipfilename.zip"
// Create a new zip file
newZipFile, err := os.Create(zipFile)
if err != nil {
panic(err)
}
defer newZipFile.Close()
// Create a new zip archive
zipWriter := zip.NewWriter(newZipFile)
defer zipWriter.Close()
// Walk through the folder and add files to the zip archive
filepath.Walk(folderToZip, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// Create a new file header
fileHeader, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
// Modify the file header to use relative path
fileHeader.Name, err = filepath.Rel(folderToZip, path)
if err != nil {
return err
}
// Add file to the zip archive
fileWriter, err := zipWriter.CreateHeader(fileHeader)
if err != nil {
return err
}
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(fileWriter, file)
if err != nil {
return err
}
}
return nil
})
}
func readZipFile() {
data, err := os.ReadFile("output.zip")
if err != nil {
fmt.Println("Error reading file:", err)
panic(err)
}
reader := bytes.NewReader(data)
zipArchive, err := zip.NewReader(reader, int64(reader.Len()))
if err != nil {
panic(err)
}
// Create temp dir to store the files of the zip archive
// creates a folder like `94950907/`
pathname, err := os.MkdirTemp(".", "")
if err != nil {
fmt.Errorf("assign template: failed to create temp dir: %v", err)
}
// defer os.RemoveAll(pathname)
for _, f := range zipArchive.File {
if err := func() error {
filePath := filepath.Join(pathname, f.Name)
fmt.Println("---------------------------------------")
fmt.Println(f.Name)
fmt.Println(filePath)
// if strings.HasSuffix(filePath, "images") {
// // filePath = filePath + "/"
// return nil
// }
switch {
case f.Name == "images/":
return nil
case f.Name == "mail.html":
case strings.HasPrefix(f.Name, "images/"):
default:
return nil
}
if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
return err
}
dstFile, err := os.Create(filePath)
if err != nil {
return err
}
defer dstFile.Close()
fileInArchive, err := f.Open()
if err != nil {
return err
}
defer fileInArchive.Close()
if _, err := io.Copy(dstFile, fileInArchive); err != nil {
return err
}
return nil
}(); err != nil {
fmt.Errorf("ERROR: %v", err)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment