2010-06-17 5 views
7

EDIT 1is_tarfile() возвращает истину пустой файл

Хм, я принимаю ответы, что деготь уважает пустой файл ... но в моей системе:

$ touch emptytar 
$ tar -tf emptytar 
tar: This does not look like a tar archive 
tar: Exiting with failure status due to previous errors 

Может быть, я неканоническая версия?

$ tar --version 
tar (GNU tar) 1.22 
Copyright (C) 2009 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Written by John Gilmore and Jay Fenlason. 

Привет всем,

Я проверяю некоторую логику для обработки пользователя при загрузке файла TAR. Когда я кормлю пустой файл tarfile.is_tarfile() возвращает True, который не то, что я ожидал:

$ touch tartest 
$ cat tartest 
$ python -c "import tarfile; print tarfile.is_tarfile('tartest')" 
True 

Если добавить текст в файл, он возвращает False, который я ожидал:

$ echo "not a tar" > tartest 
$ python -c "import tarfile; print tarfile.is_tarfile('tartest')" 
False 

я мог бы добавить проверку в начале, чтобы проверить файл нулевой длины, но на основе documentation для tarfile.is_tarfile(name) Я думаю, что это ненужным:

Вернуть True, если имя является tar-архивом , файл, который может использовать файл tarfile .

я зашел так далеко, чтобы проверить источник, tarfile.py, и я могу видеть, что он проверяет блоки заголовков, но я не совсем понимаю, как это оценивает эти блоки.

Я неправильно истолковал документацию и, следовательно, установил несправедливые ожидания?

Спасибо,
Закари

+1

«tar» Я пытался с GNU 1.15.1 (портировано Apple MacOSX/Darwin); Я затрудняюсь объяснить ваше наблюдение, что 1.22, похоже, изменилось несовместимым образом назад! –

+0

Я могу подтвердить поведение ошибки GNU tar 1.26 в пустом файле: он выдает ошибку, тогда как tarfile.is_tarfile возвращает True – m13r

ответ

1

Попробуйте в командной строке:

$ touch emptyfile 
$ tar -tvf emptyfile 

нет ошибок.

Похоже, что пустой файл просто является допустимым (но бесполезным) TAR-файлом.

+0

это, по крайней мере, не работает с tar версии 1.22 и 1.26 – m13r

-1

Это фундаментальное свойство логики.

Предполагаемое по умолчанию значение «Истина» до тех пор, пока содержимое файла не будет доказано.

Нет содержимого, нет недостоверности предположения.

+0

Так почему же zipfile.is_zipfile (пустой файл) python возвращает False? – m13r

4

Пустой файл tar является совершенно допустимым и пустым файлом tar. Учитывайте, в любой приглашении оболочки Unix:

$ touch foo.tar 
$ ls -l foo.tar 
-rw-r--r-- 1 aleax staff 0 Jun 16 18:49 foo.tar 
$ tar tvf foo.tar 
$ tar xvf foo.tar 

См.? Пустой foo.tar - это абсолютно корректный файл tar для команды Unix tar - ему просто нечего показывать или распаковать. Было бы действительно проблематично, если бы обработка Python tar была настолько резкой, как и у самого tar! Какое предложение в документах заставило вас поверить, что такая проблематичная, несовместимая с головной болью несовместимость является частью спецификации?

1

На самом деле поведение «is_tarfile», похоже, изменилось между Python 2.6 и 2.7. В Python 2.7, is_tarfile возвращает False для пустого файла.

$ touch /tmp/foo.tar 
$ python 
Python 2.7.3 (default, Jul 24 2012, 11:41:40) 
[GCC 4.6.3 20120306 (Red Hat 4.6.3-2)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import tarfile 
>>> print tarfile.is_tarfile("/tmp/foo.tar") 
False 
>>> 
$ 
+1

Я узнал это трудным путем ... –

+0

Это ответ, который я искал! – m13r

Смежные вопросы