Maison > développement back-end > Golang > le corps du texte

Pourquoi est-ce que je reçois une erreur « trop de fichiers ouverts » lors de la décompression d'un fichier tar.gz dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-04 22:35:02
original
386 Les gens l'ont consulté

Why am I getting a

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!