Maison  >  Article  >  développement back-end  >  Comment éviter les erreurs d’ouverture de fichier lors de la décompression des fichiers tar.gz dans Go ?

Comment éviter les erreurs d’ouverture de fichier lors de la décompression des fichiers tar.gz dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 20:29:29945parcourir

How to Avoid File Open Errors When Decompressing tar.gz Files in Go?

Comment décompresser le fichier tar.gz dans Go

La décompression des fichiers tar.gz est cruciale pour extraire des données et des dossiers des archives. Dans Go, ce processus implique l'utilisation des packages archive/tar et compress/gzip. Cependant, il est essentiel de s'assurer que le code utilisé extrait avec succès les fichiers sans rencontrer d'erreurs.

Solution améliorée :

Le code amélioré fourni résout le problème d'ouverture d'un fichier. une erreur se produit en raison d’un trop grand nombre de fichiers ouverts. Pour ce faire, il déplace l'instruction defer outFile.Close() à la fin de chaque instruction case qui ouvre un fichier en écriture. Cela garantit que le fichier est fermé immédiatement après la copie du contenu, empêchant ainsi l'accumulation de fichiers ouverts et l'erreur qui en résulte.

<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 file immediately after copying

        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>

Conclusion :

Ce code mis à jour décompresse correctement les fichiers tar.gz et garantit que tous les fichiers ouverts sont correctement fermés, évitant ainsi les erreurs causées par un nombre excessif de fichiers ouverts. Grâce à cette amélioration, les développeurs Go peuvent facilement extraire des données et des dossiers des archives tar.gz.

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!

Déclaration:
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