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!