„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie entpacke ich Dateien in Go einfach mit dem „zip“-Paket?

Wie entpacke ich Dateien in Go einfach mit dem „zip“-Paket?

Veröffentlicht am 17.11.2024
Durchsuche:650

How to Easily Unzip Files in Go with the `zip` Package?

Entpacken leicht gemacht mit Go

Das Entpacken von Dateien in Go ist mit dem Zip-Paket ein Kinderspiel. Aufgrund seiner Einfachheit können Sie eine Hilfsfunktion wie diese erstellen:

func Unzip(src, dest string) error {
    r, err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer func() {
        if err := r.Close(); err != nil {
            panic(err)
        }
    }()

    os.MkdirAll(dest, 0755)

    // Closure isolates file descriptor .Close() calls
    extractAndWriteFile := func(f *zip.File) error {
        rc, err := f.Open()
        if err != nil {
            return err
        }
        defer func() {
            if err := rc.Close(); err != nil {
                panic(err)
            }
        }()

        path := filepath.Join(dest, f.Name)

        // Prevent ZipSlip vulnerability
        if !strings.HasPrefix(path, filepath.Clean(dest) string(os.PathSeparator)) {
            return fmt.Errorf("illegal file path: %s", path)
        }

        if f.FileInfo().IsDir() {
            os.MkdirAll(path, f.Mode())
        } else {
            os.MkdirAll(filepath.Dir(path), f.Mode())
            f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
            if err != nil {
                return err
            }
            defer func() {
                if err := f.Close(); err != nil {
                    panic(err)
                }
            }()

            _, err = io.Copy(f, rc)
            if err != nil {
                return err
            }
        }
        return nil
    }

    for _, f := range r.File {
        err := extractAndWriteFile(f)
        if err != nil {
            return err
        }
    }

    return nil
}

Dieser Code durchläuft sorgfältig jede Datei im ZIP-Archiv, behandelt Verzeichnisse und reguläre Dateien entsprechend und stellt gleichzeitig die Gültigkeit des Dateipfads sicher. Beachten Sie, dass der Abschlussansatz unnötiges Verzögerungsstapeln eliminiert, die Kapselung verbessert und die Fehlerbehandlung rationalisiert.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3