0

gzip または bzip2 形式のプレーンな圧縮ファイル (.gz など) と gzip または bzip2 で圧縮された tarball (.tar.gz など) を区別する適切な方法は何ですか? サフィックス拡張子を使用した識別は信頼できるオプションではありませんファイルの名前が変更される可能性があるためです。

コマンドラインで、次のようなことができるようになりました。

bzip2 -dc test.tar.bz2 |head|file -

そこで、次の関数を使用して Python で同様のことを試みました。

def get_magic(self, store_file, buffer=False, look_deeper=False):
    # see what we're indexing
    if look_deeper == True:
        m = magic.Magic(mime=True, uncompress=True)
    else:
        m = magic.Magic(mime=True) 

    if buffer == False:
        try:
            file_type = m.from_file(store_file)

        except Exception, e:
            raise e

    else:
        try:
            file_type = m.from_buffer(store_file)

        except Exception, e:
            raise e

    return file_type 

次に、圧縮された tarball を読み取ろうとするときに、次の方法で別の場所からバッファを渡します。

    file_buffer = open(file_name).read(8096) 
    archive_check = self.get_magic(file_buffer, True, True)

残念ながら、これは python-magic でuncompressフラグを使用すると問題になります。なぜなら、python-magic は、バッファを読み取るだけでよいのに、ファイル全体を渡すことを期待しているように見えるからです。私は例外で終わります:

bzip2 ERROR: Compressed file ends unexpectedly

私が見ているファイルのサイズが 2M から 20GB になる可能性があるため、これはかなり問題になります。ファイル全体を読みたくありません。

ハッキングして圧縮ファイルの末尾を切り取ってバッファに追加することはできますか? python-magic を使用してファイルを圧縮解除するという考えを無視し、代わりにバッファを渡して識別する前に実行する方がよいでしょうか:

    file_buffer = open(file_name, "r:bz2").read(8096) 

より良い方法はありますか?

4

2 に答える 2

0

オフセット 257 の圧縮されていないデータが「ustar」である場合、または圧縮されていないデータ全体が 1024 ゼロ バイト (空の tar ファイル) である場合は、tar ファイルである可能性が非常に高くなります。

z = zlib.decompressobj() またはz = bz2.BZ2Decompressor()、およびを使用して、圧縮されていないデータの最初の 1024 バイトだけを読み取ることができますz.decompress()

于 2016-08-23T23:59:22.237 に答える