tarパッケージ

Tcllibはtar形式のファイルを扱うことができます。 すなわち、 tarファイルの作成、中身や属性情報の取得、展開(解凍)の各処理ができます。 まずは、既に存在するtarファイル内の属性情報を取得するサンプルです。

package require tar

set tarFile "./sample_photo.tar"

set files [::tar::contents $tarFile]
puts $files

# 全ファイルの属性をまとめて出力する
set stats [::tar::stat $tarFile]
puts $stats

# 1ファイルごとに属性を出力する
foreach e $files {
    # 結果は2要素のリストで、0...格納されているファイルのパス
    # ($eそのもの)、1...uid,sizeなどを格納しているdict
    set stats [::tar::stat $tarFile $e]
    puts $stats
    set info [lindex $stats 1]
    puts "file size of $e is ... [dict get $info size]"
}

::tar::contentsコマンドは、 tarファイル内に含まれているファイルパスの一覧を返します。 また、::tar::statコマンドは、 含まれている各ファイルの、 {ファイルパス1 その属性のdict ファイルパス2 その属性のdict ...} という形式のリストを返します。 属性には、mode uid gid size mtime type linkname uname gname devmajor devminor があります。

次にファイルの内容を取得するサンプルです。

package require tar

proc outputb {data outFileName} {
    set fout [open $outFileName w]
    fconfigure $fout -translation binary -encoding binary
    puts -nonewline $fout $data
    close $fout
}

set data [::tar::get $tarFile "sample_photo/image001.jpg"]
outputb $data "./output.jpg"

::tar::getコマンドは2つの引数{tarファイル名 ファイルパス} を取り、「tarファイル名」の中に含まれている 「ファイルパス」のファイルの内容を返します。 上の例ではJPEG画像ファイルを返しているので、 バイナリ形式で"output.jpg"という別ファイルに出力しています。

最後に、tarファイルの展開と作成です。

package require tar

::tar::untar $tarFile -dir "./work" -glob "*.jpg"

::tar::create "./new.tar" [glob -nocomplain "./sample_photo/*.jpg"]

::tar::untarコマンドは、tarファイルの中身を展開します。 引数は常に最初がtarファイル名で、 オプションがその後に続く形式なのに注意してください。
そのオプションですが、-dirで出力の基点となるディレクトリを指定できます。 (省略されたら現在の作業ディレクトリが基点) また-fileを指定するとそのファイルパスに一致するものだけ、 -globを指定するとそのファイルグロブに該当するファイルだけが展開対象になります。
またこれら以外に、 既にファイルが存在していたら上書きしない-nooverwrite、 ファイルの最終編集時刻を格納されていた情報に上書きしない-nomtime、 ファイルのパーミッションを格納されていた情報に上書きしない-noperms というオプションもあります。
::tar::createコマンドは、新しいtarファイルを作ります。 引数は {新しいtarファイル名 格納するファイルパスのリスト} です。

拡張レビュー分室 top
(first uploaded 2010/09/19 last updated 2010/09/23, MISUMI URANO)