Go (Golang) में ZIP-आर्काइव के साथ कार्य: पूर्ण गाइड
Go (Golang) में आधुनिक विकास में, आर्काइव के साथ कार्य एक सामान्य कार्य है। चाहे वह लॉग को पैकेज करना हो, सर्वर पर फ़ाइलें अपलोड करना हो या बैकअप बनाना हो - मानक लाइब्रेरी archive/zip तृतीय-पक्ष निर्भरताएँ स्थापित किए बिना ZIP-आर्काइव बनाने, पढ़ने और संशोधित करने के लिए सब कुछ प्रदान करती है। इस लेख में, हम व्यावहारिक उदाहरणों के साथ Go में ZIP के साथ बुनियादी संचालन पर चर्चा करेंगे।
पैकेज archive/zip की मुख्य क्षमताएँ
पैकेज archive/zip Go की मानक लाइब्रेरी का हिस्सा है और निम्नलिखित का समर्थन करता है:
- मनमानी फ़ोल्डर संरचना के साथ नए ZIP-आर्काइव बनाना
- मौजूदा आर्काइव की सामग्री पढ़ना
- व्यक्तिगत फ़ाइलें या पूरा आर्काइव निकालना
- मौजूदा आर्काइव में फ़ाइलें जोड़ना (कॉपी करके)
- फ़ाइल मेटाडेटा के साथ कार्य (दिनांक, अनुमतियाँ, टिप्पणियाँ)
- स्ट्रीम प्रोसेसिंग (पूरे आर्काइव को मेमोरी में लोड किए बिना)
Go में ZIP-आर्काइव बनाना
आर्काइव बनाने के लिए zip.NewWriter() का उपयोग किया जाता है, जो io.Writer स्वीकार करता है। यह आर्काइव को फ़ाइल और बफर (उदाहरण के लिए, HTTP पर भेजने के लिए) दोनों में लिखने की अनुमति देता है।
package main
import ( "archive/zip" "bytes" "fmt" "io" "log" "os")
func createZip() { // आर्काइव के लिए बफर बनाएँ buf := new(bytes.Buffer) writer := zip.NewWriter(buf)
// टेक्स्ट के साथ फ़ाइल जोड़ें file1, err := writer.Create("hello.txt") if err != nil { log.Fatal(err) } _, err = file1.Write([]byte("नमस्ते, दुनिया! यह ZIP-आर्काइव से एक फ़ाइल है।")) if err != nil { log.Fatal(err) }
// उपफ़ोल्डर में फ़ाइल जोड़ें file2, err := writer.Create("docs/readme.md") if err != nil { log.Fatal(err) } _, err = file2.Write([]byte("# दस्तावेज़ीकरणreadme की सामग्री।")) if err != nil { log.Fatal(err) }
// writer को बंद करना अनिवार्य है err = writer.Close() if err != nil { log.Fatal(err) }
// आर्काइव को फ़ाइल में सहेजें err = os.WriteFile("example.zip", buf.Bytes(), 0644) if err != nil { log.Fatal(err) } fmt.Println("आर्काइव बनाया गया: example.zip")}
func main() { createZip()}ZIP से फ़ाइलें पढ़ना और निकालना
आर्काइव पढ़ने के लिए zip.OpenReader() या zip.NewReader() (मेमोरी से डेटा के लिए) का उपयोग किया जाता है। प्रत्येक फ़ाइल को zip.File संरचना द्वारा दर्शाया जाता है।
func readZip() { reader, err := zip.OpenReader("example.zip") if err != nil { log.Fatal(err) } defer reader.Close()
for _, f := range reader.File { fmt.Printf("फ़ाइल: %s (आकार: %d बाइट)", f.Name, f.UncompressedSize64)
// फ़ाइल की सामग्री खोलें rc, err := f.Open() if err != nil { log.Fatal(err) }
// सामग्री पढ़ें content, err := io.ReadAll(rc) if err != nil { log.Fatal(err) } rc.Close()
fmt.Printf("सामग्री: %s
", content) }}सभी फ़ाइलों को डिस्क पर निकालना
अक्सर आर्काइव को निर्दिष्ट निर्देशिका में अनज़िप करने की आवश्यकता होती है। इस मामले में, उपफ़ोल्डर को सही ढंग से बनाना महत्वपूर्ण है।
func extractZip(src, dest string) { reader, err := zip.OpenReader(src) if err != nil { log.Fatal(err) } defer reader.Close()
for _, f := range reader.File { // निकालने का पथ fpath := filepath.Join(dest, f.Name)
// जाँचें कि पथ dest की सीमा से बाहर नहीं जाता (सुरक्षा) if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) { log.Fatalf("अमान्य पथ: %s", fpath) }
// फ़ोल्डर बनाएँ if f.FileInfo