ファイル操作関連のTips
ファイルとディレクトリの操作に使用できる API 、%Library.File クラス (%File が省略形) の便利なサンプルコードをご紹介します。
こちらのAPIを使用して、ディレクトリやファイルの中身をのぞいたり、作成・書込み・読込みを行ってみます。
★ディレクトリ内のファイル一覧をリストする
以下のサンプルは、C:\temp フォルダ内の *.txt ファイルをリストします(ファイルパス_サイズ_作成日)。
set stmt = ##class(%SQL.Statement).%New()
set status = stmt.%PrepareClassQuery("%File", "FileSet")
set rs = stmt.%Execute("c:\temp", "*.txt")
while rs.%Next(.rStatus) { write !, rs.%Get("Name")_"_"_rs.%Get("Size")_"byte"_"_"_rs.%Get("DateCreated") }
サブディレクトリ内のファイルを含む場合はこちら (filetest.mac で保存) ↓
test(dir)
do disp(dir)
quit
disp(dir) {
set rs=##class(%ResultSet).%New("%File:FileSet")
do rs.Execute(dir)
while(rs.Next()) {
set file=rs.Get("Name")
if rs.Get("Type")="D" { // サブディレクトリ(Type="D":ディレクトリ)の場合
do disp(file)
}
else {
write file,!
}
}
quit
}
実行結果:
USER>do ^filetest("c:\temp\java")
C:\temp\java\IRISPersentG.class
C:\temp\java\IRISPersentG.java
C:\temp\java\Sample\Address.java
C:\temp\java\Sample\Person.java
C:\temp\java\SListTestIRIS.class
C:\temp\java\SListTestIRIS.java
★シンプルなファイル作成&書き込み&読み込み
作成&書き込み
set file=##class(%File).%New("c:\temp\file.txt")
do file.Open("WSN") // 文字コードを指定したい場合は、OPENモードパラメータ(※)を "WSNK\UTF8" のように指定
do file.WriteLine("This is a test.")
do file.WriteLine("これはテストです。")
do file.Close()
Kill file
または (Streamの場合)、
set stream=##class(%Stream.FileCharacter).%New()
set stream.TranslateTable="SJIS"
set stream.Filename="C:\temp\file2.txt"
do stream.WriteLine("This is a test2.")
do stream.WriteLine("これはテストです2。")
do stream.%Save()
kill stream
読み込み
set file=##class(%File).%New("C:\temp\file.txt")
do file.Open("R")
while 'file.AtEnd { write !,file.ReadLine()} // file.Read() の場合は、既定で32000文字読み込み。.Read(len) で文字数指定も可能。
do file.Close()
kill file
または (Streamの場合)、
Set stream=##class(%Stream.FileCharacter).%New()
set stream.TranslateTable="SJIS"
Set sc=stream.LinkToFile("c:\temp\file2.txt")
while 'stream.AtEnd { write !,stream.ReadLine() }
kill stream
★ファイルの存在有無をチェック
write ##class(%File).Exists("C:\temp\file.txt") // 1:存在する , 0:存在しない
★ディレクトリの有無をチェック
write ##class(%File).DirectoryExists("C:\temp") // 1:存在する , 0:存在しない
★ファイルサイズを取得(ファイル単位)
set file="C:\temp\file.txt"
write ##class(%File).GetFileSize(file) // bytes
他にも便利な使用方法がありますので、詳細は以下のドキュメントをご覧ください。
%Library.File の使用方法