とりあえずこんな感じで使える。
(import (rnrs) (srfi :26) (archive)) ;; for this example it's tar (define-constant file "test.tar") (when (file-exists? file) (delete-file file)) ;; use tar. for zip then 'zip. (define type 'tar) (call-with-output-file file (lambda (out) (call-with-archive-output type out (lambda (zip-out) (append-entry! zip-out (create-entry zip-out "test.scm")) (append-entry! zip-out (create-entry zip-out "test-lib/bar.scm"))))) :transcoder #f) (call-with-input-file file (lambda (in) (call-with-archive-input type in (lambda (zip-in) (do ((e (next-entry! zip-in) (next-entry! zip-in))) ((not e) #t) (print (archive-entry-name e)) (unless (string=? "test.scm" (archive-entry-name e)) (print (utf8->string (call-with-bytevector-output-port (cut extract-entry e <>))))))))) :transcoder #f)書庫を作る際は現在のところファイル名を受け付けるが、展開する際はポートに吐き出すようになっている。これは、書庫のフォーマットによって必要な情報が異なるので。実際に使い出して必要そうなら多分キーワード引数で指定するとかするようにするかもしれない。当面要りそうなのは展開部分なので、とりあえずといった感じ。next-entry!が末尾に来た際に#fを返すべきかEOFを返す返すべきかは悩みどころではあるが、#fの方が後々楽じゃないかなぁとは思っている。まぁ、好みだろう。
仕組みはDBIと似ていて、書庫のタイプごとに(archive $type)ライブラリが定義されている。現状ではtarとzipのみ(RARとかLZHとか誰か書いてくれないかなぁ・・・)。後はテストとドキュメントの整備か。 テストとか使用感の関係でひょっとしたら次のバージョンでは明文化しないかもしれないが・・・リリース来週だし・・・
No comments:
Post a Comment