Created
September 9, 2025 11:44
-
-
Save 42LM/cf2dde1a03d15440b9ea4b2008514085 to your computer and use it in GitHub Desktop.
zip stuff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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