我能够循环遍历tar文件中的文件,但我仍然坚持如何将这些文件的内容作为字符串读取。我想知道如何以字符串形式打印文件的内容?
这是我的代码
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)
}
}
答案 0 :(得分:5)
只需将tar.Reader用作您要阅读的每个文件的io.Reader。
tr := tar.NewReader(r)
// get the next file entry
h, _ := tr.Next()
如果您需要将整个文件作为字符串:
// 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)
如果你需要逐行阅读,那么这会更好:
// 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
}
答案 1 :(得分:0)
在官方网站的帮助下,这是我之前的意图。应该将特殊焦点转到底部,从字节到字符串的转换。
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)
//Using a bytes buffer is an important part to print the values as a string
bud := new(bytes.Buffer)
bud.ReadFrom(tr)
s := bud.String()
fmt.Println(s)
fmt.Println()
}
}
答案 2 :(得分:0)
有时我看到人们使用 tar.gz
作为临时数据库,所以我找到了它
将存档读入 fstest.MapFS
很有用:
package main
import (
"archive/tar"
"compress/gzip"
"io"
"os"
"testing/fstest"
)
func tarGzMemory(source string) (fstest.MapFS, error) {
file, err := os.Open(source)
if err != nil { return nil, err }
defer file.Close()
gzRead, err := gzip.NewReader(file)
if err != nil { return nil, err }
tarRead := tar.NewReader(gzRead)
files := make(fstest.MapFS)
for {
cur, err := tarRead.Next()
if err == io.EOF { break } else if err != nil { return nil, err }
if cur.Typeflag != tar.TypeReg { continue }
data, err := io.ReadAll(tarRead)
if err != nil { return nil, err }
files[cur.Name] = &fstest.MapFile{Data: data}
}
return files, nil
}
示例:
package main
func main() {
m, e := tarGzMemory("mingw64.db.tar.gz")
if e != nil {
panic(e)
}
data := m["mingw-w64-x86_64-gcc-10.2.0-10/desc"].Data
print(string(data))
}