"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो में रूट फोल्डर के बिना फोल्डर सामग्री को ज़िप कैसे करें?

गो में रूट फोल्डर के बिना फोल्डर सामग्री को ज़िप कैसे करें?

2024-11-18 को प्रकाशित
ब्राउज़ करें:206

How to Zip Folder Content Without the Root Folder in Go?

रूट फ़ोल्डर के बिना एक फ़ोल्डर के भीतर सामग्री को ज़िप करना

आवश्यकता एक ज़िप फ़ाइल बनाने की है जिसमें निर्देशिका के भीतर फ़ाइलें शामिल हैं, को छोड़कर निष्कर्षण पर निर्देशिका स्वयं रूट फ़ोल्डर के रूप में होती है।

प्रदान किया गया स्निपेट निम्नलिखित का उपयोग करके हेडर नाम सेट करके इसे प्राप्त करने का प्रयास करता है पंक्ति:

header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))

हालाँकि, यह कोड आधार निर्देशिका (उदाहरण के लिए, "dir1") को जोड़ता है हेडर नाम, जिसके परिणामस्वरूप एक संग्रह बनता है जहां फ़ाइलें निर्देशिका संरचना के भीतर नेस्ट की जाती हैं।

इस समस्या के समाधान के लिए, लाइन को इसके साथ प्रतिस्थापित किया जाना चाहिए निम्नलिखित:

header.Name = strings.TrimPrefix(path, source)

यह हेडर नाम से आधार निर्देशिका को हटा देता है, यह सुनिश्चित करता है कि फ़ाइलें निर्देशिका संरचना के बिना निकाली गई हैं।

संशोधित कोड इस तरह दिखेगा:

import (
    "archive/zip"
    "fmt"
    "io"
    "os"
    "path/filepath"
)

func Zipit(source, target string) error {
    zipfile, err := os.Create(target)
    if err != nil {
        return err
    }
    defer zipfile.Close()

    archive := zip.NewWriter(zipfile)
    defer archive.Close()

    info, err := os.Stat(source)
    if err != nil {
        return nil
    }

    filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        header, err := zip.FileInfoHeader(info)
        if err != nil {
            return err
        }

        if info.IsDir() {
            header.Name  = "/"
        } else {
            header.Method = zip.Deflate
        }

        writer, err := archive.CreateHeader(header)
        if err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }
        defer file.Close()
        _, err = io.Copy(writer, file)
        return err
    })

    return err
}

func main() {
    err := Zipit("path/dir1"  "/", "test" ".zip")
    if err != nil {
        fmt.Println(err)
    }
}

यह कोड ज़िप फ़ाइल में निर्देशिका को शामिल किए बिना सामग्री को प्रभावी ढंग से "dir1" निर्देशिका के भीतर ज़िप करता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3