代码之家  ›  专栏  ›  技术社区  ›  Zach Young mo1010

对于空白文件,is\tarfile()返回True

  •  7
  • Zach Young mo1010  · 技术社区  · 16 年前

    嗯,我接受tar尊重一个空文件的答案。。。但在我的系统里:

    $ 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) 我认为这是不必要的:

    如果名称是tar存档,则返回True

    我甚至查到了源头, tarfile.py ,我可以看到它正在检查头块,但我不完全理解它是如何评估这些块的。

    谢谢您,
    扎卡里

    4 回复  |  直到 16 年前
        1
  •  1
  •   dkamins    16 年前

    在命令行中尝试以下操作:

    $ touch emptyfile
    $ tar -tvf emptyfile
    

    没有错误。

    看起来一个空文件只是一个有效(但无用)的TAR文件。

        2
  •  4
  •   Alex Martelli    16 年前

    空的tar文件 一个完全有效的,空的tar文件。在任何Unix shell提示下,请考虑:

    $ 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 是Unix的完全有效的tar文件 tar 焦油 它自己!文档中的哪句话让你相信这种有问题的、令人头痛的不兼容性是规范的一部分?

        3
  •  1
  •   Stephen C    13 年前

    事实上,“is\u tarfile”的行为在python2.6和2.7之间似乎发生了变化。在Python2.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
    >>> 
    $ 
    
        4
  •  -1
  •   S.Lott    16 年前

    这是逻辑的一个基本特征。

    没有内容,也没有反驳这个假设。