Heim  >  Artikel  >  Backend-Entwicklung  >  Wie dekomprimiere ich tar.gz-Dateien in Go, ohne die Dateiöffnungsgrenzen zu überschreiten?

Wie dekomprimiere ich tar.gz-Dateien in Go, ohne die Dateiöffnungsgrenzen zu überschreiten?

Linda Hamilton
Linda HamiltonOriginal
2024-11-04 15:19:02812Durchsuche

How to Decompress tar.gz Files in Go Without Exceeding File Open Limits?

Tar.gz-Dateien in Go dekomprimieren

Das Dekomprimieren von tar.gz-Dateien in Go erfordert die Verwendung der Pakete archive/tar und compress/gzip. Während ein Beispielcode bereitgestellt wurde, traten Probleme im Zusammenhang mit den Dateiöffnungsbeschränkungen auf.

Um dieses Problem zu beheben, schlagen wir unten eine aktualisierte Lösung vor, die die Art und Weise ändert, wie die Ausgabedatei geschlossen wird.

<code class="go">import (
    "archive/tar"
    "compress/gzip"
    "fmt"
    "io"
    "log"
    "os"
)

func ExtractTarGz(gzipStream io.Reader) {
    uncompressedStream, err := gzip.NewReader(gzipStream)
    if err != nil {
        log.Fatal("ExtractTarGz: NewReader failed")
    }

    tarReader := tar.NewReader(uncompressedStream)

    for true {
        header, err := tarReader.Next()

        if err == io.EOF {
            break
        }

        if err != nil {
            log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
        }

        switch header.Typeflag {
        case tar.TypeDir:
            if err := os.Mkdir(header.Name, 0755); err != nil {
                log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
            }
        case tar.TypeReg:
            outFile, err := os.Create(header.Name)
            if err != nil {
                log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
            }
            if _, err := io.Copy(outFile, tarReader); err != nil {
                log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
            }
            outFile.Close()

        default:
            log.Fatalf(
                "ExtractTarGz: uknown type: %s in %s",
                header.Typeflag,
                header.Name)
        }

    }
}

func main() {
    r, err := os.Open("./file.tar.gz")
    if err != nil {
        fmt.Println("error")
    }
    ExtractTarGz(r)
}</code>

Indem wir die Ausgabedatei unmittelbar nach dem Kopieren des Inhalts aus dem TAR-Reader schließen, geben wir Dateideskriptorressourcen frei, die zuvor die Fehler im Zusammenhang mit der Überschreitung der Grenzwerte für offene Dateien verursachten. Dieser aktualisierte Code sollte tar.gz-Dateien in Go erfolgreich dekomprimieren.

Das obige ist der detaillierte Inhalt vonWie dekomprimiere ich tar.gz-Dateien in Go, ohne die Dateiöffnungsgrenzen zu überschreiten?. 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