Lambdaカクテル

集団への盲従を激しく嫌う

`UIOP:with-temporary-file` つかいどころ

使う機会があったので備忘録.

https://github.com/fare/asdf/blob/master/uiop/stream.lisp に実装されて いる.

with-temporary-file は,一時ファイルを作成してシンボルにパス名かスト リームを束縛する. :stream:pathname かのどちらかを少なくとも受け取らなければならない. 処理の完了後は、自動的にファイルが閉じられる.

(with-temporary-file (:stream s :pathname p)
  ...)
&key description
:stream 一時ファイルへのストリームが束縛される
:pathname 一時ファイルへのパスが束縛される
:keep 評価後もファイルを残すか
:prefix/:suffix 一時ファイルの接頭辞/接尾辞
:directory 一時ファイルの保存先(絶対パスLinuxはデフォルトで/tmp)
:type 一時ファイルの拡張子(デフォルトではtmp)
:direction 一時ファイルの開き方(:io :input :outputのいずれか)

bodyが実行された後に:keep に対応する式が評価される.これがtと評価されなければ,一時 ファイルは削除される.デフォルトではnil

(uiop:with-temporary-file (:stream s :pathname p :keep t)
           (format t "path is ~a~%" p)
           (format s "hello, temporary file!"))
path is /tmp/tmpVA1K97E4.tmp
NIL
$ cat /tmp/tmpVA1K97E4.tmp
hello, temporary file!%

:keepを指定しない場合は,式の終了後にファイルは消えてしまう.

(uiop:with-temporary-file (:stream s :pathname p)
           (format t "path is ~a~%" p)
           (format s "hello, temporary file!"))
path is /tmp/tmp70D3CAC9.tmp
NIL
$ cat /tmp/tmp70D3CAC9.tmp
cat: /tmp/tmp70D3CAC9.tmp: そのようなファイルやディレクトリはありません

:prefixを指定するとファイル名にprefixがつく.:suffixも指定できる.

(uiop:with-temporary-file (:stream s :pathname p :prefix "piyo")
           (format t "path is ~a~%" p)
           (format s "hello, temporary file!"))
path is /tmp/piyoAITYOLR9.tmp
NIL

:directoryを指定すると,一時ファイルの作成先をデフォルトのディレクトリから変更できる.

(uiop:with-temporary-file (:stream s :pathname p :prefix "piyo" :directory "/tmp/hoge")
           (format t "path is ~a~%" p)
           (format s "hello, temporary file!"))
path is /tmp/hoge/piyoW2BJXM5B.tmp
NIL

ディレクトリがないときは自動的に新規作成されるが,削除は行わない.