番号 | 記号 | 初期キー | 機能 |
---|---|---|---|
#70 | #O | [ESC]O @O | ファイルのオープン |
ファイルのオープンを実行する。
戻り値 r:0=ファイルをオープン; 1以上=既存のファイル(テキスト番号); -1=エラー(無効なパス名やキャンセルなど)
#70(#O)は最も基本的なファイル操作コマンドであり,指定ファイルをオープンするためにマクロでも多用される。
#70(#O)を実行すると,ファイル名入力ウィンドウが表示され入力待ちになる。任意のファイル名を入力し,#04(#m)コマンド(通常[CR]/[RET]/[Enter]キー)の実行すると次の戻り値を返す。(文字列ヒストリは pf を使用する)
正常実行 | r = 0 | ファイルをオープンした |
不正常実行1 | r > 0 | 既にオープンしているファイルのテキスト番号(wn) |
不正常実行2 | r = -1 | オープン失敗のエラー(無効なパス名やキャンセルなど) |
ファイルのオープンに成功すると !Open イベントマクロが実行される。
無効
無効
#70(#O)コマンドは無効だが,同じシンボルの#Oは「ディレクトリの比較」を実行するファイラー専用コマンドに割り当てられている。ダブルウィンドウモード時に,ターゲットになるディレクトリと内容の比較を行い,差異のあるファイルに選択マークを付ける。比較対象とする項目は,以下の5種がある(括弧内は欧文表示時)。
存在(Exist),新しい(New),古い(Old),大きい(Large),小さい(Small)。
(この表示は,システムメニュー7番の設定に依存する。)
無効
#70(#O)は最も基本的なファイル操作コマンドであるためマクロでも多用される。コマンドの拡張は通常行わないので,マクロでコマンドを使用する場合の注意点を概説する。
#O "hoge.txt" #m ;基本形
実際の操作をトレースしても同じコードが得られるが,現実には色々とエラー処理が必要になる。例えば,オープンしたいファイルが既存のファイルなのか,新規ファイルなのかで分岐の必要がある。
まず,既存のファイルをオープンしようとしたが,失敗した場合。
「"【パス名】"は見つかりません. 新規ファイルですか? (Y/N)」というメッセージを表示して応答待ちになる。なにもしなければマクロは入力待ちのまま永遠に終了しないので,'n'(No)で応答したのち入力窓を閉じる。
#O "hoge.txt" #m
(s>3)?{ 'n' #[ &m(6) . } ;新規ファイルを自動生成しない
上記の例では,#[で入力窓を閉じたのち無言で終了するのではなく「オープンできません」というシステムメッセージを表示して終了している。多少,親切である。
また,単純に終了させるのでなく,オープンに失敗した場合の代替処理を用意するのであれば,戻り値の判定により条件分岐させることが可能だ。
#O "hoge.txt" #m
(s>3)?{ 'n' #[ &m(6) } ;新規ファイルを自動生成しない
(r==-1)?. ;オープンに失敗したら終了
戻り値rが-1のときはオープンに失敗している。つまり既存のファイルをオープンしようとしている場合は,致命的なエラーのおそれがあるということになるので,即座に処理を中断させて理由を確認した方がよいかもしれない。このコードは,(r+1)??.と短く(あるいは難解に^^)記述することもできる。
逆に,新規ファイルをオープンしようとしている場合は,オープンに必ず「失敗」する必要がある。とは言え,事前にファイルの存在を検索することは効率的ではないし,日時をファイル名にしても絶対に確実とは言えない。どうしても新規ファイルをオープンしたい場合は#71(#R)コマンドによりリードオンリーファイルとしてオープンすることが推奨される。
整形マクロ等で作業用の一時ファイルをオープンし,作業の終了後に電子の藻屑よろしくファイルの痕跡も残したくない場合は,絶対に存在しないファイル名を指定すればよい。…とは言っても,8文字+3文字の限られた文字数で,「絶対」に存在しないファイル名をひねり出さねばならぬと考えることはナンセンスである。ここはシステムで予約されたデバイス名を使うのが上策と言える。
#O "nul" #m ;絶対に存在しないファイル名を指定
なお,存在し得ないファイル名でも,作業ファイルを開けたままでいると,オープン中のファイルということで警告される。したがって作業ファイルをオープンする際には,先に述べたとおり,このコマンドではなく#72(#R)コマンドを使用すれば,オープン時もクローズ時も警告が表示されないので,応答する余計なコードの記述を省略できる。