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

Lire le contenu d'un fichier tar sans l'extraire sur le disque

王林
Libérer: 2024-02-09 22:27:21
avant
680 Les gens l'ont consulté

读取 tar 文件的内容而不解压到磁盘

l'éditeur php Strawberry vous présentera aujourd'hui une technique très pratique : lire le contenu d'un fichier tar sans le décompresser sur le disque. Au cours du processus de développement, nous devons souvent traiter des fichiers tar, mais les décompresser sur le disque puis les lire prendra beaucoup de temps et d'espace disque. En utilisant l'extension Archive_Tar de PHP, nous pouvons lire directement le contenu du fichier tar, éviter le fastidieux processus de décompression et améliorer l'efficacité du code. Découvrons ensuite les étapes spécifiques !

Contenu de la question

J'ai pu parcourir les fichiers dans un fichier tar, mais je n'ai jamais compris comment lire le contenu de ces fichiers sous forme de chaînes. Je veux savoir comment imprimer le contenu d'un fichier sous forme de chaîne ?

Voici mon code

package main

import (
    "archive/tar"
    "fmt"
    "io"
    "log"
    "os"
    "bytes"
    "compress/gzip"
)

func main() {
    file, err := os.Open("testtar.tar.gz")

    archive, err := gzip.NewReader(file)

    if err != nil {
        fmt.Println("There is a problem with os.Open")
    }
    tr := tar.NewReader(archive)

    for {
        hdr, err := tr.Next()
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("Contents of %s:\n", hdr.Name)
    }
}
Copier après la connexion

Solution de contournement

Utilisez simplement tar.reader comme io.reader pour chaque fichier que vous souhaitez lire.

tr := tar.newreader(r)

// get the next file entry 
h, _ := tr.next()
Copier après la connexion

Si vous avez besoin du fichier entier sous forme de chaîne :

// read the complete content of the file h.name into the bs []byte
bs, _ := ioutil.readall(tr)

// convert the []byte to a string
s := string(bs)
Copier après la connexion

Si vous avez besoin de lire ligne par ligne, c'est mieux :

// create a Scanner for reading line by line
s := bufio.NewScanner(tr)

// line reading loop
for s.Scan() {

  // read the current last read line of text
  l := s.Text()

  // ...and do something with l

}

// you should check for error at this point
if s.Err() != nil {
  // handle it
}
Copier après la connexion

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:stackoverflow.com
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
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!