%File オブジェクトの操作
ファイル自体を操作する場合、%Library.FileOpens in a new tab クラスの %New() メソッドを使用して、%File オブジェクトをインスタンス化する必要があります。このクラスには、ファイルの操作に使用できるインスタンス・メソッドも用意されています。
ここでは、%File オブジェクトを使用した例を説明のためにいくつか紹介しています。
単にファイルの読み取りおよび書き込みを行う場合は、%Stream.FileCharacter クラスおよび %Stream.FileBinary クラスを使用してください。これらのクラスでは、ファイルを自動的に適切なモードで開くといった追加機能を利用できるためです。
ファイル名またはディレクトリ名の一部を指定すると、ほとんどのメソッドでは、作業中のネームスペースの既定のグローバル・データベースが含まれるディレクトリを基準とした項目を参照しているものと想定されます。このディレクトリをここでは "既定のディレクトリ" と呼びます。このルールが当てはまらない場合は注記しています。
また、これらのメソッドでファイル名とディレクトリ名の大文字と小文字が区別されるのは、基盤となるオペレーティング・システムでファイル名とディレクトリ名の大文字と小文字が区別される場合だけです。つまり、UNIX® ではファイル名またはディレクトリ名の大文字と小文字が区別されますが、Windows では区別されません。
%File オブジェクトのインスタンスの作成
ファイルを操作するには、%New() メソッドを使用して、そのファイルを表す %File オブジェクトをインスタンス化する必要があります。対象のファイルは、ディスクに既に存在する場合も存在しない場合もあります。
以下の例では、既定のディレクトリ内のファイル export.xml の %File オブジェクトをインスタンス化します。
set fileObj = ##class(%File).%New("export.xml")
ファイルの開閉
%File オブジェクトをインスタンス化した後、ファイルに対して読み取りまたは書き込みを行うには、Open() メソッドを使用してファイルを開く必要があります。
USER>set status = fileObj.Open()
USER>write status
1
ファイルを閉じるには、Close() メソッドを使用します。
USER>do fileObj.Close()
%File オブジェクトのプロパティの確認
ファイルをインスタンス化したら、ファイルのプロパティを直接確認できます。
USER>write fileObj.Name
export.xml
USER>write fileObj.Size
2512
USER>write $zdate(fileObj.DateCreated)
11/18/2020
USER>write $zdate(fileObj.DateModified)
11/18/2020
USER>write fileObj.LastModified
2020-11-18 14:24:38
USER>write fileObj.IsOpen
0
LastModified は人が読める形式のタイムスタンプであり、$H 形式の日付ではないことに注意してください。
Size、DateCreated、DateModified、および LastModified の各プロパティは、アクセスされたときに計算されます。存在しないファイルのプロパティにアクセスすると、ファイルが見つからなかったことを示す -2 が返されます。
現在、実際に作成された日付を追跡しているプラットフォームは Windows のみです。その他のプラットフォームは、ファイル・ステータスの最後の変更の日付を格納しています。
USER>write ##class(%File).Exists("foo.xml")
0
USER>set fooObj = ##class(%File).%New("foo.xml")
USER>write fooObj.Size
-2
ファイルが開いているときに CanonicalName プロパティにアクセスすると、そのファイルのキャノニック形式の名前を表示できます。これは、ルート・ディレクトリからのフル・パスです。
USER>write fileObj.CanonicalName
USER>set status = fileObj.Open()
USER>write fileObj.IsOpen
1
USER>write fileObj.CanonicalName
c:\intersystems\IRIS\mgr\user\export.xml
ファイルからの読み取り
ファイルから読み取るには、ファイルを開いてから Read() メソッドを使用します。
以下の例では、messages.log の最初の 200 文字を読み取ります。
USER>set messages = ##class(%File).%New(##class(%File).ManagerDirectory() _ "messages.log")
USER>set status = messages.Open("RU")
USER>write status
1
USER>set text = messages.Read(200, .sc)
USER>write text
*** Recovery started at Mon Dec 09 16:42:01 2019
Current default directory: c:\intersystems\IRIS\mgr
Log file directory: .\
WIJ file spec: c:\intersystems\IRIS\mgr\IR
USER>write sc
1
USER>do messages.Close()
ファイルから 1 行全体を読み取るには、ReadLine() メソッドを使用します。これは、%Library.FileOpens in a new tab の親クラス %Library.AbstractStreamOpens in a new tab から継承されるメソッドです。
以下の例では、C:\temp\shakespeare.txt の最初の行を読み取ります。
USER>set fileObj = ##class(%File).%New("C:\temp\shakespeare.txt")
USER>set status = fileObj.Open("RU")
USER>write status
1
USER>set text = fileObj.ReadLine(,.sc)
USER>write text
Shall I compare thee to a summer's day?
USER>write sc
1
USER>do fileObj.Close()
ファイルへの書き込み
ファイルに書き込むには、ファイルを開いてから Write() メソッドまたは WriteLine() メソッドを使用します。
以下の例では、新規ファイルに 1 行のテキストを書き込みます。
USER>set fileObj = ##class(%File).%New("C:\temp\newfile.txt")
USER>set status = fileObj.Open("WSN")
USER>write status
1
USER>set status = fileObj.WriteLine("Writing to a new file.")
USER>write status
1
USER>write fileObj.Size
24
ファイルの巻き戻し
ファイルに対して読み取りまたは書き込みを行った後に、Rewind() メソッドを使用してファイルを巻き戻すと、ファイルの先頭から操作を実行できます。
前述の例で停止した場所から処理を始める場合、fileObj は現在、ファイルの末尾にあります。ファイルを巻き戻してもう一度 WriteLine() を使用すると、ファイルを上書きする処理が行われます。
USER>set status = fileObj.Rewind()
USER>write status
1
USER>set status = fileObj.WriteLine("Rewriting the file from the beginning.")
USER>write status
1
USER>write fileObj.Size
40
ファイルをいったん閉じてから再度開くことでも、ファイルを巻き戻すことができます。
USER>do fileObj.Close()
USER>set status = fileObj.Open("RU")
USER>write status
1
USER>set text = fileObj.ReadLine(,.sc)
USER>write sc
1
USER>write text
Rewriting the file from the beginning.
ファイルのクリア
ファイルをクリアするには、ファイルを開いてから Clear() メソッドを使用します。これにより、ファイル・システムからファイルが削除されます。
以下の例では、既定のディレクトリ内のファイル junk.xml がクリアされます。
USER>write ##class(%File).Exists("junk.xml")
1
USER>set fileObj = ##class(%File).%New("junk.xml")
USER>set status = fileObj.Open()
USER>write status
1
USER>set status = fileObj.Clear()
USER>write status
1
USER>write ##class(%File).Exists("junk.xml")
0