Nim前記事の実装編です。Nimでtarの作成(アーカイブ)と伸長の処理を実装します。前記事にも書きましたが、完全な互換性は目指さず、基本的な使い方の範疇でゆるく作成したつもりです。くじ:プログラム使い方アーカイブ(pack)種別(typeflag)長いパスチェックサムコンテント展開(unpack)長いパスustarのパス処理コンテントプログラム長くなりますが先に今回のプログラムsimpletar.nimを記載しておきます。エンコードはUTF-8を想定。tarで使うAsciiはUTF-8のサブセットなので、書き込むデータのエンコーディングは特に気にしなくとも大丈夫だと思います。伸長の処理はNimbleにあるuntarを参考にしました。公開プロシージャ(という言い方で正しいのかしら)のpackとunpackを使えば、(名前の通り)それぞれアーカイブと伸長ができるようになっています。アーカイブしたいときはもとのディレクトリへのパスと、出力する予定のtarファイルのパスを指定します。指定されたパスが有効か(存在するか、など)はプロシージャの中で一応チェックしています。dst)展開したいときは逆に、もとのtarファイルのパスと、出力する先のディレクトリへのパスを指定します。dst)例外が発生した場合は、その内容を表示してプロシージャを抜けます。以下に詳細を説明しておきます。アーカイブpackプロシージャでアーカイブします。アーカイブ(あるディレクトリ以下のサブディレクトリ/ファイルからtarファイルを作成する)は、基本的にはディレクトリ階層をたどって、ヘッダとコンテントを作る作業です。ディレクトリ)を取得します。バイナリゼロで512バイトのバイト列を作っておき、種別に応じてtypeflagなどヘッダに詰める値を切り替えます。modeの値などはPythonの実装に寄せてハードコーディングしています。header長いパス長いパスが入ってきた場合には、Lフラグを使ってパスを格納するためのヘッダとコンテントを別途作る必要があります。ここではmakeHeader()プロシージャ内でpreheaderという変数を使ってLフラグ用のヘッダと、フルパス本体をコンテントとして作成しています。(unsigned)に型変換し総和を取ります。初期化段階でチェックサム用のフィールドchecksum[8]は全て空白(半角スペース)で埋めておきます。"コンテント入力ファイルストリーム(元のファイル)から出力ファイルストリーム(tarファイル)へコピーします。(COPY_BUFFER_SIZE)で決めておき、順次コピーしていきます。'\0'.repeat(padding))512バイト単位のブロックで構成する必要がありますので、足りない部分はバイナリゼロでパディングします。deferを使うと、途中でIOエラーなどの例外が発生した場合でもブロックを抜けるときにファイルストリームを閉じてくれます。展開(unpack)unpackプロシージャで展開します。tarを処理できれば実用上は十分そう。逆に言えば、Pax交換フォーマットはサポートしません。magicのところにこれら2つの形式のもの以外が入っている場合は、アーカイブの終端か、非サポートの形式として処理を終了します。基本的に、パス以外のメタデータは修正しません。tarファイルのヘッダ自体には最終更新時刻のタイムスタンプなどが含まれますが、それらのメタデータは反映しません。長いパスヘッダは、tarファイルから512バイトの長さ(1バイト文字列の長さ)を読み込み、ファイル名やサイズなどの各フィールドを取り出します。tarでLフラグが設定されているものは、長いパスを格納しているブロックになりますので、ファイル名のみコンテントから抽出し、他の内容はその次のヘッダ以降を参照します。ustarの場合はprefixフィールドに追加のパスが格納されている可能性があるので、ヌル終端文字列として読み、連結します。この場合、ファイル名用のフィールドname[100]とプレフィクス用のフィールドprefix[155]をパス区切り文字で結合してフルパスを取得します。filenameコンテントアーカイブ時の説明にあるように、コンテントは512バイト単位になるようパディングされています。ヘッダに格納されている実際のファイルサイズを参照して、その長さ分だけコピーします。コピーが終わった後はファイル読み込み位置を次のブロック先頭へ進めておきます。アーカイブの際も使っていますが、roundup()プロシージャは512単位で整数を切り上げるためのものです。usta関連記事NimコンパイラをWindowsにインストールするNimのWindows向けインストール方法をメモしておきます。検証した環境は以下の通り。...記事を読むPythonとNimでXZ圧縮を利用するファイル圧縮の形式は世にいろいろありますが、昨今はzipがもっとも一般的でしょうか。~ちゃぶだい返し(理論編)~Tarは特にLinuxで普及しているアーカイブ形式。英語圏でTarballなどとも呼ばれます。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。