記事
Megumi Kakechi · 2023年2月6日 3m read

ファイル操作関連の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

OPEN モード・パラメータ

または (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 の使用方法


enlightenedご参考
ObjectScript クックブック  

2
0 55
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください