2011-12-27 1 views
4

ファイルの内容に文字列を使用して、Pythonの階層的なディレクトリ構造を持つtarアーカイブを作成します。私はthis questionを読みました。これは、文字列をファイルとして追加する方法を示しますが、ディレクトリとしては表示しません。ディレクトリを実際に作成せずにtarアーカイブに追加するにはどうすればよいですか?以下のようなどのようにして、プログラマチックに、ネストされたディレクトリとファイルをPythonの文字列からのみ、一時ファイルなしでtarアーカイブにすることができますか?

何か:the tar file formatを見て

archive.tgz: 
    file1.txt 
    file2.txt 
    dir1/ 
     file3.txt 
     dir2/ 
      file4.txt 

答えて

5

リンク質問に与えられた例を拡張し、次のように、あなたがそれを行うことができます。

import tarfile 
import StringIO 
import time 

tar = tarfile.TarFile("test.tar", "w") 

string = StringIO.StringIO() 
string.write("hello") 
string.seek(0) 

info = tarfile.TarInfo(name='dir') 
info.type = tarfile.DIRTYPE 
info.mode = 0755 
info.mtime = time.time() 
tar.addfile(tarinfo=info) 

info = tarfile.TarInfo(name='dir/foo') 
info.size=len(string.buf) 
info.mtime = time.time() 
tar.addfile(tarinfo=info, fileobj=string) 

tar.close() 

デフォルト値が必要とされているディレクトリの所有者のための実行権限を含まない場合がありますので、mode属性を持つように注意してくださいそれに変更してその内容を入手してください。

+1

... 'TarInfo.mtime'メンバを設定して、GNU tarの'間違いなく古いタイムスタンプ '警告を防ぐことができます。 –

+0

@larsmansあなたはそうです。私は 'TarInfo.mtime'を設定する答えを更新しました。ご連絡ありがとうございます。 – jcollado

1

それはなんとかようです。各サブディレクトリにあるファイルには、相対パス名(例:dir1/file3.txt)が名前として付けられます。

唯一のトリックは、それに入るファイルの前に各ディレクトリを定義する必要があることです(tarは、必要なサブディレクトリをオンザフライで作成しません)。ディレクトリとしてタールファイルエントリを識別するために使用できる特別なフラグがありますが、従来の目的のためにtarは、ディレクトリを表すように/で終わる名前を持つファイルエントリを受け入れるので、ファイルとしてdir1/を追加するだけで済みます。同じテクニックを使用した長さゼロの文字列。

関連する問題