我想实现一个程序来在GoLang中提取tar文件,但是在提取之前,我想检查该文件是否为tar文件。我不只是检查文件扩展名。在shell中,我可以使用以下命令来执行此操作:
file AFile.tar
AFile.tar: POSIX tar archive (GNU)
但是我应该在GoLang中做什么?
答案 0 :(得分:3)
我猜您可以使用archive/tar
软件包。这是一个未经测试的示例:
tr := tar.NewReader(&buf)
hdr, err := tr.Next()
if err != nil {
// not a tar file...
}
调用tr.Next()
应该很便宜,因为它仅检查标头。对于有效的tar文件,标头将检出...
答案 1 :(得分:0)
import (
"archive/tar"
"fmt"
"io"
"os"
"errors"
)
// ExtractTar extract tar
func ExtractTar(stream io.Reader, name string) error {
tarReader := tar.NewReader(stream)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return fmt.Errorf("extract tar next failed: %w", err)
}
switch header.Typeflag {
case tar.TypeDir:
if err := os.Mkdir(header.Name, 0750); err != nil {
return fmt.Errorf("extract tar mkdir: %w", err)
}
case tar.TypeReg:
outFile, err := os.Create(name)
if err != nil {
return fmt.Errorf("extract tar create: %w", err)
}
defer outFile.Close()
if _, err := io.Copy(outFile, tarReader); err != nil {
return fmt.Errorf("extract tar copy failed: %w", err)
}
default:
return errors.New(fmt.Sprintf("extract tar: unknown type: %v in %s", header.Typeflag, header.Name))
}
}
return nil
}
答案 2 :(得分:0)
最后,我在go中使用shell:
shell := fmt.Sprintf(`
uncompress_if_necessary(){
local FILE=$1
result=$(file $FILE | grep 'gzip compressed data')
[[ -z $result ]] && {
return
}
echo "$FILE is a gzip compressed file, need to uncompress"
tar -zxvf $FILE
} && cd %s && uncompress_if_necessary %s >> %s
`, dirPath, filePath, taskLogFilePath)
cmd := exec.Command("/bin/bash", "-c", shell)
return cmd.Run()