Как проверить, является ли файл tar файлом в GoLang? - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу реализовать программу для извлечения файла tar в GoLang, но перед извлечением я хочу проверить, является ли файл файлом tar. Меня не интересует только проверка расширения файла. А в оболочке я могу использовать следующую команду:

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

Но что мне делать в GoLang?

Ответы [ 3 ]

3 голосов
/ 07 февраля 2020

Я думаю, вы могли бы использовать пакет archive/tar. Вот непроверенный пример:

tr := tar.NewReader(&buf)
hdr, err := tr.Next()
if err != nil {
  // not a tar file...
}

Вызов tr.Next() должен быть дешевым, поскольку он только проверяет заголовок. Для действительного файла tar заголовок будет проверен ...

0 голосов
/ 07 февраля 2020
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
}

0 голосов
/ 07 февраля 2020

Файл команды с открытым исходным кодом. Вы можете просто перенести код.

https://github.com/file/file/blob/8305d1cc5ec466b2d50d1b6000e7b3c8c4b08853/src/is_tar.c

...