Heim > Artikel > Backend-Entwicklung > Warum erhalte ich beim Dekomprimieren einer tar.gz-Datei in Go die Fehlermeldung „Zu viele geöffnete Dateien“?
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>
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!