Heim > Backend-Entwicklung > Golang > Wie kann ich Dateien in Go effizient entpacken und häufige Fehler vermeiden?

Wie kann ich Dateien in Go effizient entpacken und häufige Fehler vermeiden?

Linda Hamilton
Freigeben: 2024-11-11 06:41:02
Original
870 Leute haben es durchsucht

How can I unzip files in Go efficiently and prevent common errors?

Dateien mühelos mit Go entpacken

Dateien in Go zu entpacken sollte ein Kinderspiel sein, aber manchmal stößt man auf Hindernisse. Lassen Sie uns eine unkomplizierte Lösung zum effektiven Entpacken von Dateien erkunden.

Anfänglicher Code:

Sie haben das folgende Code-Snippet präsentiert:

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

    for _, f := range r.File {
        rc, err := f.Open()
        if err != nil {
            return err
        }
        defer rc.Close()

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

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

    return nil
}
Nach dem Login kopieren

Optimierte Lösung:

Um den ursprünglichen Code zu verbessern, beachten Sie Folgendes Verbesserungen:

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 to address file descriptors issue
    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)

        // Check for ZipSlip (Directory traversal)
        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
}
Nach dem Login kopieren

Verbesserungen:

  • Erstellung des Zielverzeichnisses: Wenn das Zielverzeichnis nicht existiert, wird es vorher erstellt Entpacken.
  • Schließung für Dateideskriptoren:An Vermeiden Sie Verzögerungsstapelprobleme, ein Abschluss schließt den Dateiextraktions- und Schreibvorgang ab.
  • ZipSlip-Prävention: Eine Prüfung stellt sicher, dass extrahierte Dateien im angegebenen Zielordner bleiben.
  • Fehlerbehandlung: Close()-Vorgänge werden für Best Practices mit error panic() behandelt.

Das obige ist der detaillierte Inhalt vonWie kann ich Dateien in Go effizient entpacken und häufige Fehler vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage