Comment décompresser le fichier tar.gz dans Go
Dans cette question, l'utilisateur tente de décompresser un fichier appelé fichier.tar. gz, qui contient un dossier, en utilisant Go. Ils ont rencontré une erreur indiquant "trop de fichiers ouverts" lors de la tentative de création d'un fichier.
Le code fourni extrait essentiellement le contenu d'un fichier tar.gz, mais il y a un problème mineur dans la gestion des fichiers réguliers. fichiers (TypeReg). L'erreur réside dans le fait de ne pas fermer le fichier de sortie, outFile, après avoir copié son contenu. Ne pas fermer correctement le fichier entraîne l'erreur "trop de fichiers ouverts" car le fichier reste ouvert même après le retour de la fonction.
Pour remédier à cela, nous pouvons modifier la fonction ExtractTarGz pour fermer le fichier de sortie après la copie son contenu. Voici le code mis à jour :
<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>
Le code modifié inclut un appel à outFile.Close() pour fermer explicitement le fichier de sortie après avoir copié son contenu. Cela garantit que le fichier est correctement fermé et libéré, évitant ainsi l'erreur « trop de fichiers ouverts ».
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!