Heim >Backend-Entwicklung >Golang >Wie entpacke ich Dateien in Go einfach mit dem „zip'-Paket?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-13 05:57:02721Durchsuche

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. Dank seiner Einfachheit können Sie eine Dienstprogrammfunktion 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 angemessen 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.

Das obige ist der detaillierte Inhalt vonWie entpacke ich Dateien in Go einfach mit dem „zip'-Paket?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn