とりあえずこんな感じで使える。
(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