Maison >développement back-end >Golang >Lire le contenu d'un fichier tar sans l'extraire sur le disque

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

王林
王林avant
2024-02-09 22:27:21717parcourir

读取 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)
    }
}

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()

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)

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
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer