% Function OPEN
Function OPEN
open
filespec &key
direction element-type if-exists if-does-not-exist external-format
=> stream
filespec - パス名指定子
direction - :input
, :output
, :io
, :probe
のどれか。
デフォルトは:input
。
element-type -
character
として認識可能なサブタイプの型指定子か、
整数の有限値として認識可能なサブタイプの型指定子か、
シンボルであるsigned-byte
, unsigned-byte
のうちのひとつか、
あるいは:default
。
デフォルトはcharacter
。
if-exists - :error
, :new-version
, :rename
, :rename-and-delete
,
:overwrite
, :append
, :supersede
, nil
のどれか。
デフォルトは、filespecのバージョンの要素が:newest
のときは:new-version
、
それ以外のときは:error
。
if-does-not-exist - :error
, :create
, nil
のどれか。
デフォルトは、もしdirectionが:input
であるか
if-existsが:overwrite
か:append
のときは:error
。
directionが:output
か:io
でありかつ
if-existsが:overwrite
でも:append
でもないときは:create
。
directionが:probe
のときはnil
。
external-format - 外部ファイルフォーマット指定子。デフォルトは:default
。
stream - ファイルストリームか、nil
open
は、filespecによって指定されたファイルと接続した
ファイルストリームを作成し、開き、返却します。
filespecは開かれるファイルの名前です。
もしfilespec指定子がストリームのとき、
そのストリームは最初に閉じられたり、
あるいはその他の影響を受けることはありません。
open
のキーワード引数は、
返却されるファイルストリームの特性と、
どのようにエラーを扱うかを指定します。
directionが:input
か:probe
のときか、
あるいはif-existsが:new-version
ではなく
同時にfilespecのバージョン要素が:newest
のときは、
開かれたファイルはすでにファイルシステム内に存在しているので、
そのバージョンはファイルシステム内の、
他のパス名の要素がfilespecと同じである
他のどんなファイルのものより大きなバージョンになります。
実装はopen
の全てのキーワードオプションを識別し、
ホストオペレーティングシステムの構造上で
適切な処理を行うよう要求されます。
例えば、もしファイルシステムが
ファイルのバージョンの区別をサポートせず、
さらに削除と抹消(deleting
とexpunging
)の表記を区別できないとき、
:new-version
は:rename
か:supersede
と同じように扱われ、
:rename-and-delete
は:supersede
と同じように扱われることが考えられます。
:direction
:input
:output
:io
open
によって返却される前にクローズされます。:element-type
:default
が指定されたとき、
その単位はファイルシステムによって決まり、
可能であればファイルを元に決定されます。:if-exists
:output
か:io
であり、
filespecの名前のファイルがすでに存在しているときに
実行する動作を指定します。
もしdirectionが:input
か、指定されなかったか、あるいは:probe
のとき、
if-existsは無視されます。
open
の結果はif-existsの次の値によって変更されます。:error
file-error
のエラーが通知されます。:new-version
:rename
:rename-and-delete
expunging
ではなく削除deleting
し、
そして新しいファイルを生成します。:overwrite
:io
であり、ファイルが読み込みと書き込みの両方を許可する
双方向モードとして開かれたとき、
そのファイルポインターは初期状態ではファイルの最初に位置します。
しかしファイルが開かれたときに、
ファイルは長さ0
として前方に切り捨てられることはありません。:append
:io
のとき、ファイルが読み込みと書き込みの両方を許可する
双方向モードとして開かれます。:supersede
nil
nil
が返却されます。:if-does-not-exist
open
の結果はif-does-not-existsの次の値によって変更されます。:error
file-error
のエラーが通知されます。:create
nil
nil
が返却されます。:external-format
:default
ですが、
実装は追加の外部ファイルフォーマットを定義することが許されており、
stream-external-format
によって返却される
実装依存の値を
仕様に適合したプログラムで使用することができます。character
のサブタイプである要素の型の
ファイルストリームに対して意味があります。
このオプションは、これらの値に意味を持たない
ストリームに対しては無視されます。
しかし実装は意味を持つ他の要素の型を定義することができます。
もし指定した外部ファイルフォーマットによって表現できない
文字を書き込んだ時の結果は指定されていません。ファイルが開かれたとき、 ファイルストリームは Lisp環境においてファイルシステムに仕える代理人として構築され、 ファイルストリームへの操作は 対象のファイルシステム内の指定したファイル上の操作として反映されます。
ファイルはopen
によって、削除、名前の変更、破壊的な修正が行われます。
open
とパス名の関係については、19.2.3. パス名のマージをご確認ください。
(open filespec :direction :probe) => #<Closed Probe File Stream...>
(setq q (merge-pathnames (user-homedir-pathname) "test"))
=> #<PATHNAME :HOST NIL :DEVICE device-name :DIRECTORY directory-name
:NAME "test" :TYPE NIL :VERSION :NEWEST>
(open filespec :if-does-not-exist :create) => #<Input File Stream...>
(setq s (open filespec :direction :probe)) => #<Closed Probe File Stream...>
(truename s) => #<PATHNAME :HOST NIL :DEVICE device-name :DIRECTORY
directory-name :NAME filespec :TYPE extension :VERSION 1>
(open s :direction :output :if-exists nil) => NIL
ホストコンピューターのファイルシステムの性質と状態
if-existsが:error
のとき
(上記のリストにあるif-existsの意味の制約に従い)、
型file-error
のエラーが発生します。
if-does-not-existが:error
のとき
(上記のリストにあるif-does-not-existの意味の制約に従い)、
型file-error
のエラーが発生します。
ここで指定された何かの挙動において
実装が何らかのオプションを処理できなかったときは、
型error
のエラーが通知されるかもしれません。
(wild-pathname-p filespec)
がtrueのとき、
型file-error
のエラーが発生します。
実装がexternal-formatを解釈できなかったときは、
型error
のエラーが発生します。
現在存在する様々なファイルシステムは大きく異なった機能を持っており、 あるファイルシステムの様相はここで定義された仕様の範囲を超えています。 実装はこれらの全てのオプションについて 規定された動作を正確にサポートできないかもしれません。 実装はこれらの全てのキーワードオプションを認識し、 ホストファイルシステムの環境上において 「適切な」何らかの挙動を試行することが求められます。 ファイルシステムに適合させるために必要であれば、 実装はここで指定された意味からわずかに逸脱しても、 仕様に適合した実装として失格とみなされることはありません。 もし、あるオプションをここで指定されたものと同様の方法で処理することが 実装上まったく不可能な場合は、単にエラーが通知されます。
:element-type
オプションに関して、
ファイルシステムでサポートされていない型が指定されたとき、
そのような型をアップグレードした型を代用することが許されます。
最小の要求としては、
あるファイルに対して指定した要素の型で出力ストリームを開き、
後で同じファイルに対して同じ要素の型で入力ストリームを開いたときに
矛盾なく動作することが求められます。
with-open-file
,
close
,
pathname
,
logical-pathname
,
19.2.3. パス名のマージ,
19.1.2. ファイル名としてのパス名
open
は、異常な退出が生じたときに
自動的にはファイルをクローズしません。
element-typeがcharacter
のサブタイプのとき、
read-char
とwrite-char
が結果のファイルストリームで使用できます。
element-typeが整数のサブタイプのとき、
read-byte
とwrite-byte
が結果のファイルストリームで使用できます。
element-typeが:default
のとき、
その型はstream-element-type
を使うことで決定することができます。