El formato de archivo tar es here en Wikipedia.
Sospecho que su mejor opción sería verificar que la suma de comprobación del encabezado para el primer archivo sea válida. También es posible que desee comprobar el nombre del archivo para la cordura, pero que puede no ser confiable, dependiendo de los nombres de archivo que se han almacenado allí.
duplicando la información relevante aquí:
Offset Size Description
0 100 File name
100 8 File mode
108 8 Owner's numeric user ID
116 8 Group's numeric user ID
124 12 File size in bytes
136 12 Last modification time in numeric Unix time format
148 8 Checksum for header block
156 1 Link indicator (file type)
157 100 Name of linked file
La suma de comprobación se calcula tomando la suma de los valores de byte sin signo del bloque de cabecera con los ocho bytes de suma de comprobación adoptadas para ser espacios ASCII (valor decimal 32)
Se almacena como un número octal de seis dígitos con ceros a la izquierda seguidos por un valor nulo y luego un espacio.
Varias implementaciones no se adhieren a esto, por lo que confiar en el primer espacio blanco recortado seis dígitos para la suma de comprobación produce una mejor compatibilidad. Además, algunas implementaciones históricas de tarot trataron los bytes como firmados.
Los lectores deben calcular la suma de comprobación de ambas maneras, y tratarla como buena si la suma con o sin signo coincide con la suma de comprobación incluida.
También está el formato Ustar (también se detalla en ese enlace), pero, ya que es una extensión del formato tar edad, el método detallado anteriormente debería seguir funcionando. UStar generalmente solo almacena información adicional sobre cada archivo.
Como alternativa, dado que Python es de código abierto, se puede ver cómo funciona el is_tarfile
y comprobar la transmisión en lugar de un archivo. El código fuente está disponible here bajo Python-3.1.1/Lib/tarfile.py
pero no es para corazones débiles :-)
Esto plantea la pregunta: ¿Admite el módulo tarfile de Python los diferentes formatos de alquitrán de los que está hablando con is_tarfile() al verificar archivos directamente? – Shule
@Shule Para responder a esta pregunta, puede echar un vistazo al código fuente del módulo para ['is_tarfile()'] (https://hg.python.org/cpython/file/2.7/Lib/tarfile.py#l2616) . – mhawke