如何在GoLang中检查文件是否为tar文件?

时间:2020-02-07 03:43:38

标签: go tar

我想实现一个程序来在GoLang中提取tar文件,但是在提取之前,我想检查该文件是否为tar文件。我不只是检查文件扩展名。在shell中,我可以使用以下命令来执行此操作:

file AFile.tar
AFile.tar: POSIX tar archive (GNU)

但是我应该在GoLang中做什么?

3 个答案:

答案 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()
相关问题