[Python-ml-jp 5033] Re: tarfileのgetnames()のセパレータについて
十河 満
coolhead @ a1.mbn.or.jp
2010年 9月 15日 (水) 06:19:35 JST
TANAKAさん、ソガワです。早速のレスありがとうございます。
私もソース見てみました。先ず2.5と2.6のdiff取ったら相当量差分がでまして、
これじゃ解らないので、2.5のソースを読むと、こちらは積極的にセパレータを
付けてました。シンボリックリンクや特殊なファイルは除いて、例えば
os.path.abspath(".") なんかで見ると、ディレクトリの最後にはセパレータは
付きませんので、セパレータが付かないのが正しいのかもしれません。
(2010/09/14 13:57), TANAKA Kazuyoshi wrote:
> こんにちは。
>
> Subject: [Python-ml-jp 5031] tarfileのgetnames()のセパレータについて
> Message-ID: <4C8E88EE.7080408 @ a1.mbn.or.jp>
>
>> ソガワと申します。またお世話になります。
>> 次のプログラム(TestTarFile.py)をディレクトリ(TestTarFile)に入れて、
>> 色々なプラットフォームでtarfileを作るテストしていたら、ディレクトリ
>> の最後にセパレータが付いたり付かなかったりします。
> 興味がありましたのでソースを追いかけてみました。
> 以下は Ubuntu 10.04 の python 2.6 で確認しました。
>
> まず、格納時にはセパレータ付きで格納されています。
>
> で、問題(?)はファイル一覧を getnames() で読み出すときのようです。
>
> tarfile.py(1802)
>> def getnames(self):
> (略)
>> return [tarinfo.name for tarinfo in self.getmembers()]
> 上記のように TarInfo class の name メンバを直接参照しているのですが、
> この場合ディレクトリでもセパレータがつかないようになっています。
>
> で、なぜセパレータがつかないのですが、TarInfo class の frombuf メンバ
> の中で削除しているからのようです。
>
> tarfile.py(1222)
>> if obj.isdir():
>> obj.name = obj.name.rstrip("/")
> なぜこういった仕様になったかはちょっとわかりません。ソガワさんの投稿か
> らしますと 2.6 以降の変更ではないかと思われます。が、理由まではわかりま
> せん。
>
> もし、セパレータ付きの一覧が必要であれば getmembers で取得した TarInfo
> class の get_info を呼び出すか、isdir() の時にセパレータを付加するのがい
> いのではないかと思います。
あまり複雑にしたくないので、最後にセパレータがあれば無視するようにします。
ありがとうございました。
Python-ml-jp メーリングリストの案内