Как определить, являются ли данные допустимым файлом tar без файла?

Еще нет того, насколько я знаю. Друг и я работаем над Windows с открытым исходным кодом epoll реализация (ссылка ниже), но мы сталкиваемся с проблемами, выясняющими, как заставить его действовать то же как реализация Linux.

Текущие препятствия:

  • В Linux, дескрипторы файлов и дескрипторы сокета являются взаимозаменяемыми, но в Windows они не. Оба должны быть совместимы с epoll реализацией.
  • В Windows это довольно хитро для получения событий ядра..., который является, как epoll работает в Linux. Мы предполагаем, что программа, пользующаяся нашей межплатформенной epoll библиотекой, будет работать заметно медленнее в Windows, чем Linux.

я попытаюсь возвратиться и обновить это сообщение, поскольку мы делаем успехи с проектом.

http://sourceforge.net/projects/cpoll

6
задан Martin Thoma 3 December 2014 в 10:13
поделиться

4 ответа

Допустим, ваши загруженные данные содержатся в строке data .

from tarfile import TarFile, TarError
from StringIO import StringIO

sio = StringIO(data)
try:
    tf = TarFile(fileobj=sio)
    # process the file....
except TarError:
    print "Not a tar file"

Существуют дополнительные сложности, такие как обработка различных форматов файлов tar и сжатие. Дополнительная информация доступна в документации tarfile .

3
ответ дан 8 December 2019 в 17:23
поделиться

Формат tar-файла здесь в Википедии.

Я подозреваю, что лучше всего будет проверить правильность контрольной суммы заголовка для первого файла. Вы также можете проверить имя файла на работоспособность, но это может быть ненадежно, в зависимости от имен файлов, которые были там сохранены.

Дублирование соответствующей информации здесь:

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

Контрольная сумма вычисляется путем взятия суммы значений байтов без знака в блоке заголовка, причем восемь байтов контрольной суммы считаются пробелами ASCII (десятичное значение 32).

Оно сохраняется как шестизначное восьмеричное число с ведущими нулями, за которыми следует ноль, а затем пробел.

. Различные реализации этого не придерживаются, поэтому использование первых шести знаков пробела для контрольной суммы дает лучшую совместимость. К тому же, некоторые исторические реализации tar обрабатывают байты как подписанные.

Читатели должны вычислять контрольную сумму в обоих направлениях и рассматривать ее как правильную, если сумма со знаком или без знака совпадает с включенной контрольной суммой.

Существует также формат UStar (также подробно описанный в эту ссылку), но, поскольку это расширение старого формата tar, метод, описанный выше, должен работать. UStar обычно предназначен для хранения дополнительной информации о каждом файле.

В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile , и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py , но он не для слабонервных: -)

и считать его хорошим, если сумма со знаком или без знака соответствует включенной контрольной сумме.

Существует также формат UStar (также подробно описанный в этой ссылке), но, поскольку это расширение старого формата tar, метод, описанный выше, должен все еще работают. UStar обычно предназначен для хранения дополнительной информации о каждом файле.

В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile , и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py , но он не для слабонервных: -)

и считать его хорошим, если сумма со знаком или без знака соответствует включенной контрольной сумме.

Существует также формат UStar (также подробно описанный в этой ссылке), но, поскольку это расширение старого формата tar, метод, описанный выше, должен все еще работают. UStar обычно предназначен для хранения дополнительной информации о каждом файле.

В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile , и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py , но он не для слабонервных: -)

описанный выше метод должен работать. UStar обычно предназначен для хранения дополнительной информации о каждом файле.

В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile , и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py , но он не для слабонервных: -)

описанный выше метод должен работать. UStar обычно предназначен для хранения дополнительной информации о каждом файле.

В качестве альтернативы, поскольку Python является открытым исходным кодом, вы можете увидеть, как работает is_tarfile , и адаптировать его для проверки вашего потока, а не файла. Исходный код доступен здесь в разделе Python-3.1.1 / Lib / tarfile.py , но он не для слабонервных: -)

5
ответ дан 8 December 2019 в 17:23
поделиться

Метод open для tarfile принимает файловый объект в своем аргументе fileObj . Это может быть экземпляр StringIO

3
ответ дан 8 December 2019 в 17:23
поделиться

Класс TarFile принимает объект fileobj. Я предполагаю, что вы можете передать любой объект частичной загрузки, который вы получаете из своего веб-фреймворка.

__init__(self, name=None, mode='r', fileobj=None)

Добавление к сообщению paxdiablo: tar - очень сложный и сложный формат файла, несмотря на его кажущуюся простоту. Вы можете проверить базовое ограничение, но если вам нужно поддерживать все возможные существующие диалекты tar, вы потратите много времени. Большая часть ее сложности проистекает из следующих проблем:

  • отсутствие реального стандарта до тех пор, пока не существовал стандарт де-факто (UStar / pax)
  • дыры в спецификации, оставляющие поставщикам серые зоны, где каждый реализовал свое собственное решение
  • поставщики говорят «наш tar лучше, и он возьмет верх над миром t3h»
  • ограничения, и обходные пути для этих ограничений (например, длина имени файла)

Кроме того, формат не имеет предварительного заголовка, поэтому единственный способ проверить, в порядке ли весь архив, - это полностью просканировать файл, перехватить каждую запись и проверить каждую.

3
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: