Định dạng tệp tar là here trên Wikipedia.
Tôi nghi ngờ đặt cược tốt nhất của bạn là kiểm tra xem tổng kiểm tra đầu trang cho tệp đầu tiên có hợp lệ hay không. Bạn cũng có thể muốn kiểm tra tên tệp cho tính chính xác nhưng điều đó có thể không đáng tin cậy, tùy thuộc vào tên tệp đã được lưu trữ trong đó.
nhân đôi các thông tin liên quan ở đây:
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
Các checksum được tính bằng cách lấy tổng của các giá trị byte unsigned của khối đầu với tám byte checksum đưa đến là không gian ASCII (giá trị thập phân 32).
Nó được lưu trữ dưới dạng số bát phân có sáu chữ số với số 0 đứng đầu theo sau là dấu cách và sau đó là dấu cách.
Triển khai khác nhau không tuân theo điều này, do đó, dựa vào không gian màu trắng đầu tiên được cắt sáu chữ số để kiểm tra mang lại khả năng tương thích tốt hơn. Ngoài ra, một số triển khai tar lịch sử đã xử lý các byte như đã ký.
Người đọc phải tính tổng kiểm tra theo cả hai cách và coi nó là tốt nếu số tiền đã ký hoặc chưa ký khớp với tổng kiểm tra được bao gồm.
Ngoài ra còn có định dạng UStar (cũng được nêu chi tiết trong liên kết đó) nhưng vì đó là phần mở rộng cho định dạng tar cũ, phương pháp được nêu chi tiết ở trên vẫn hoạt động. UStar thường chỉ lưu trữ thêm thông tin về mỗi tệp.
Ngoài ra, vì Python là nguồn mở, bạn có thể xem cách hoạt động của is_tarfile
và điều chỉnh nó để kiểm tra luồng của bạn chứ không phải tệp. Mã nguồn có sẵn here dưới Python-3.1.1/Lib/tarfile.py
nhưng nó không dành cho người yếu tim :-)
Điều này đặt ra câu hỏi: Mô-đun tarfile của Python có hỗ trợ các định dạng tar khác nhau mà bạn đang nói đến với is_tarfile() khi kiểm tra tệp trực tiếp không? – Shule
@Shule Để trả lời câu hỏi đó, bạn có thể xem mã nguồn mô-đun cho ['is_tarfile()'] (https://hg.python.org/cpython/file/2.7/Lib/tarfile.py#l2616) . – mhawke