Heim > Backend-Entwicklung > Golang > Warum erhalte ich beim Dekomprimieren einer tar.gz-Datei in Go die Fehlermeldung „Zu viele geöffnete Dateien'?

Warum erhalte ich beim Dekomprimieren einer tar.gz-Datei in Go die Fehlermeldung „Zu viele geöffnete Dateien'?

Mary-Kate Olsen
Freigeben: 2024-11-04 22:35:02
Original
462 Leute haben es durchsucht

Why am I getting a

So dekomprimieren Sie die Datei tar.gz in Go

In dieser Frage versucht der Benutzer, eine Datei namens file.tar zu dekomprimieren. gz, das einen Ordner enthält, mit Go. Beim Versuch, eine Datei zu erstellen, ist ein Fehler mit der Meldung „zu viele geöffnete Dateien“ aufgetreten.

Der bereitgestellte Code extrahiert im Wesentlichen den Inhalt einer tar.gz-Datei, es gibt jedoch ein kleines Problem bei der Verarbeitung regulärer Dateien Dateien (TypeReg). Der Fehler liegt darin, dass die Ausgabedatei outFile nach dem Kopieren ihres Inhalts nicht geschlossen wird. Wenn die Datei nicht ordnungsgemäß geschlossen werden kann, wird der Fehler „Zu viele geöffnete Dateien“ angezeigt, da die Datei auch nach Rückkehr der Funktion geöffnet bleibt.

Um dies zu beheben, können wir die ExtractTarGz-Funktion so ändern, dass die Ausgabedatei nach dem Kopieren geschlossen wird dessen Inhalt. Hier ist der aktualisierte Code:

<code class="go">package main

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() // Close the output file after copying its contents
        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>
Nach dem Login kopieren

Der geänderte Code enthält einen Aufruf von outFile.Close(), um die Ausgabedatei nach dem Kopieren ihres Inhalts explizit zu schließen. Dadurch wird sichergestellt, dass die Datei ordnungsgemäß geschlossen und freigegeben wird, wodurch der Fehler „Zu viele geöffnete Dateien“ verhindert wird.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich beim Dekomprimieren einer tar.gz-Datei in Go die Fehlermeldung „Zu viele geöffnete Dateien'?. 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