2010-06-17 19 views
7

EDIT 1is_tarfile() restituisce True per un file vuoto

Hmm, accetto le risposte che tar rispetta un file vuoto ... ma sul mio sistema:

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

Forse ho una versione non canonica?

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

Ciao a tutti,

sto testando una logica per gestire un utente caricamento di un file TAR. Quando mi nutro un file vuoto per tarfile.is_tarfile() ritorna True, che non è quello che mi aspetto:

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

Se posso aggiungere del testo al file, restituisce False, che mi aspetto:

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

potrei aggiungere un controllo all'inizio per verificare la presenza di un file di lunghezza zero, ma sulla base del documentation per tarfile.is_tarfile(name) Penso che questo sia unecessary: ​​

Restituisce True se il nome è un file tar , che il modulo tarfile può leggere .

sono andato al punto di controllare la fonte, tarfile.py, e posso vedere che sta controllando i blocchi di intestazione ma non comprendere appieno come si sta valutando quei blocchi.

Sto fraintendendo la documentazione e quindi ponendo delle aspettative ingiuste?

Grazie,
Zachary

+1

Il 'tar' che ho provato con GNU è 1.15.1 (come portato da Apple a MacOSX/Darwin); Non riesco a spiegare la tua osservazione sul fatto che 1.22 sembra essere cambiata in un modo incompatibile all'indietro! –

+0

Posso confermare il comportamento di errore di GNU tar 1.26 su un file vuoto: genera un errore mentre tarfile.is_tarfile restituisce True – m13r

risposta

1

provateci a riga di comando:

$ touch emptyfile 
$ tar -tvf emptyfile 

Nessun errore.

Sembra che un file vuoto sia semplicemente un file TAR valido (ma inutile).

+0

questo almeno non funziona con tar versione 1.22 e 1.26 – m13r

-1

Questa è una caratteristica fondamentale della logica.

L'ipotesi di default è "True" fino a prova falsa del contenuto del file.

Nessun contenuto, nessuna conferma dell'ipotesi.

+0

Quindi perché zipfile.is_zipfile di python (file vuoto) restituisce False? – m13r

4

Un file tar vuoto è un file tar perfettamente valido e vuoto. Si consideri, a qualsiasi prompt della shell 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 

Vedere? Il file vuoto foo.tar è un file tar perfettamente valido per il comando Unix tar: non ha nulla da mostrare o da decomprimere. Sarebbe davvero problematico se la gestione dei tar di Python differisse così drasticamente da quella di tar stessa! Quale frase dei documenti ti ha portato a credere che un'incompatibilità così problematica e che causa mal di testa sia parte delle specifiche?

1

In realtà, il comportamento di "is_tarfile" sembra essere cambiato tra Python 2.6 e 2.7. In Python 2.7, is_tarfile restituisce False per un file vuoto.

$ 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

Ho imparato questo nel modo più difficile ... –

+0

Questa è la risposta che stavo cercando! – m13r

Problemi correlati