2010-06-17 14 views
7

EDIT 1is_tarfile() zwraca True dla pustego pliku

Hmm, ja akceptuje odpowiedź, że smoła względami pusty plik ... ale w moim systemie:

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

może mam wersja niekanoniczna?

$ 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. 

Witam wszystkich,

jestem testowania pewnej logiki do obsługi użytkownika przesłaniem pliku TAR. Kiedy karmię pusty plik do tarfile.is_tarfile() zwraca True, który jest nie to, czego oczekuję:

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

Jeśli dodać jakiś tekst do pliku, zwraca False, który Oczekuję:

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

mogę dodać czek na początku w celu sprawdzenia pliku o zerowej długości, ale w oparciu o documentation dla tarfile.is_tarfile(name) Myślę, że to unecessary: ​​

Return True, jeśli name jest archiwum tar plik, który moduł tarfile może odczytać .

Poszedłem tak daleko, aby sprawdzić źródło, tarfile.py, i widzę, że sprawdza on bloki nagłówków, ale nie w pełni rozumiem, w jaki sposób ocenia te bloki.

Czy błędnie interpretuję dokumentację, a tym samym ustalam nieuczciwe oczekiwania?

Dziękuję
Zachary

+1

"tar", którego próbowałem, to GNU 1.15.1 (przeniesiony przez Apple na MacOSX/Darwin); Nie jestem w stanie wyjaśnić waszej obserwacji, że 1.22 najwyraźniej zmieniło się w sposób niekompatybilny wstecz! –

+0

Potrafię potwierdzić zachowanie błędu GNU tar 1.26 na pustym pliku: zgłasza błąd, podczas gdy tarfile.is_tarfile zwraca True – m13r

Odpowiedz

1

Spróbuj to w wierszu poleceń:

$ touch emptyfile 
$ tar -tvf emptyfile 

bez błędów.

Wygląda na to, że pusty plik jest po prostu poprawnym (ale bezużytecznym) plikiem TAR.

+0

to przynajmniej nie działa z wersją tar 1.22 i 1.26 – m13r

-1

Jest to fundamentalna cecha logiki.

Domyślnym założeniem jest "prawda", dopóki nie zostanie udowodnione, że zawartość pliku jest fałszywa.

Bez zawartości, bez obawy o założeniu.

+0

Dlaczego więc plik zipfile.is_zipfile Pythona (emptyfile) zwraca false? – m13r

4

Pusty plik tar to całkowicie poprawny i pusty plik tar. Rozważ, przy każdej zachęcie do powłoki Uniksa:

$ 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 

Zobacz? Pusty foo.tar jest doskonale poprawnym plikiem tar dla polecenia Unix tar - nie ma nic do pokazania ani rozpakowania. Byłoby naprawdę problematyczne, gdyby obsługa targów w Pythonie różniła się tak drastycznie od samej wersji tar! Jakie zdanie w dokumentach doprowadziło cię do przekonania, że ​​taka problematyczna, wywołująca ból niekompatybilność jest częścią specyfikacji?

1

Rzeczywiście zachowanie "is_tarfile" wydaje się zmieniać między Pythonem 2.6 a 2.7. W Pythonie 2.7, is_tarfile zwraca False dla pustego pliku.

$ 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

Nauczyłem się tego na własnej skórze ... –

+0

Oto odpowiedź, której szukałem! – m13r

Powiązane problemy