Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membongkar Fail dengan Mudah dalam Go dengan Pakej `zip`?

Bagaimana untuk Membongkar Fail dengan Mudah dalam Go dengan Pakej `zip`?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-13 05:57:02628semak imbas

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

Menyahzip Menjadi Mudah dengan Go

Menyahzip fail dalam Go adalah mudah dengan pakej zip. Kesederhanaannya membolehkan anda mencipta fungsi utiliti seperti ini:

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
}

Kod ini dengan teliti melelaran setiap fail dalam arkib zip, mengendalikan direktori dan fail biasa dengan sewajarnya sambil memastikan kesahihan laluan fail. Ambil perhatian bahawa pendekatan penutupan menghapuskan tindanan penangguhan yang tidak perlu, meningkatkan enkapsulasi dan memperkemas pengendalian ralat.

Atas ialah kandungan terperinci Bagaimana untuk Membongkar Fail dengan Mudah dalam Go dengan Pakej `zip`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn