【IRIS/Cache】%Fileの備忘録

クラス「%Library.File.cls」のAPIをまとめました。

※この記事は下記の方向けになります。
  • %Fileの使い方を忘れた方
  • IRIS/Cacheでファイルやディレクトリの操作を行いたい方

クエリ系

ファイル検索

適宜修正してご利用ください。

ClassMethod search(ByRef data, rootPath As %String, wc As %String = "", sort As %String = "Name")
{
	try{
		s stmt = ##class(%SQL.Statement).%New()
		$$$ThrowOnError( stmt.%PrepareClassQuery("%File", "FileSet") )
 		s res = stmt.%Execute(rootPath, wc, sort)
 		while (res.%Next(.sts)) {
	 		s path=res.%Get("Name")
	 		i (res.%Get("Type")="D"){
		 		// ディレクトリの場合は回帰処理
		 		d ..search(path, .data)
	 		}else{
		 		s data($i(data)) = $lb(path, res.%Get("Size"), res.%Get("DateCreated"), res.%Get("DateModified"), res.%Get("ItemName"))
	 		}
	 	}
	 	$$$ThrowOnError(sts)
	}catch e {
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

引数

名称説明
data検索結果を格納する
rootPath検索するディレクトリの指定
wc検索パターン。「*.txt」等と指定する。
*=0文字以上一致, ?=1文字一致
sort並び順を指定する
Name(名称), DateCreated(作成日時), DateModified(更新日時), Size(ファイルサイズ)等

取得値

引数「data」にリスト形式で取得できます。

説明
Nameファイルのフルパス
Sizeファイルサイズ(Byte)
DateCreatedファイル作成日時(yyyy-MM-dd HH:mm:ss.SSS)
DateModifiedファイル更新日時(yyyy-MM-dd HH:mm:ss.SSS)
ItemNameファイル名

ドライブ名取得

適宜修正してご利用ください。

ClassMethod drive(full As %Boolean = 1)
{
	try{
		s stmt = ##class(%SQL.Statement).%New()
		$$$ThrowOnError( stmt.%PrepareClassQuery("%File", "DriveList") )
 		s res = stmt.%Execute(full)
 		while (res.%Next(.sts)) {
	 		w !,res.%Get("Drive")
	 	}
	 	$$$ThrowOnError(sts)
	}catch e {
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

ドライブ名を取得します。
引数「full=1」だと「D:\」が取得でき、「full=0」だと「D:」で取得できます。

ディレクトリの分解

どう活用するんでしょうか・・・

ClassMethod parse(dir As %String)
{
	try{
		s stmt = ##class(%SQL.Statement).%New()
		$$$ThrowOnError( stmt.%PrepareClassQuery("%File", "ParseDirectory") )
 		s res = stmt.%Execute(dir)
 		while (res.%Next(.sts)) {
	 		w !,"Name:",res.%Get("Name")," ,","IsDrive:",res.%Get("IsDrive")," ,","Directory:",res.%Get("Directory")
	 	}
	 	$$$ThrowOnError(sts)
	}catch e {
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

ディレクトリを分解しながら取得可能

↓テスト実行
d ##class(developer.text.Sample).parse(“D:\IRISDB\SAMPLE\IRIS.DAT“)

↓結果
Name:D: ,IsDrive:1 ,Directory:D:\
Name:IRISDB ,IsDrive:0 ,Directory:D:\IRISDB\
Name:SAMPLE ,IsDrive:0 ,Directory:D:\IRISDB\SAMPLE\

ファイル操作等々

ディレクトリ作成系

直下のみ作成可能

ディレクトリの作成に成功したら1が、失敗or既に存在している場合は0が返る

s flg = ##class(%File).CreateDirectory(name) // flg=1:成功, 0:失敗
s flg = ##class(%File).CreateNewDir(dir, name) // flg=1:成功, 0:失敗

途中のディレクトリもまとめて作成

s flg = ##class(%File).CreateDirectoryChain(name) // flg=1:成功, 0:失敗

存在確認系

ディレクトリの確認

ディレクトリが存在すれば1を、存在していなければ0を返す

s flg = ##class(%File).DirectoryExists(dirName) // flg=1:成功, 0:失敗

ファイルの確認

ディレクトリの確認も兼ねるので、使い分けた方が事故は少なくなると思います。

s flg = ##class(%File).Exists(dirName) // flg=1:成功, 0:失敗

削除

ディレクトリの削除

空のディレクトリのみ削除が可能
ファイル等があるとディレクトリの削除が失敗し0が返る

s flg = ##class(%File).RemoveDirectory(dirName) // flg=1:成功, 0:失敗

ファイルや、下位ディレクトリが有ろうが無かろうが削除が可能
事故に注意!

s flg = ##class(%File).RemoveDirectoryTree(dirName) // flg=1:成功, 0:失敗

ファイルの削除

ファイル専用でディレクトリの削除はできません。

s flg = ##class(%File).Delete(name) // flg=1:成功, 0:失敗

まとめて削除する

ファイル名にワイルドカードが含まれている場合、複数ファイルをまとめて削除可能
 例) s name = “D:\Temp\IRIS\to\sample\sample_202411*.txt”

※サブディレクトリは削除対象

s flg = ##class(%File).ComplexDelete(name) // flg=1:成功, 0:失敗

コピー系

ディレクトリのコピー

引数「from」から「to」へコピーを行う。

k created
s flg = ##class(%File).CopyDir(from, to, overlay, .created) // flg=1:成功, 0:失敗
zw created
名称説明
overlay初期値=0
0の場合、コピー先に同じ名称のディレクトリ名がある場合、コピーが失敗する。
1の場合、コピー先に同名ファイルがあれば削除してコピーする。
createdコピー操作で作成されたディレクトリorファイルの数をカウントする

ファイルのコピー

fromからtoへコピーを行う。
コピー先に同名のファイルがあっても上書きを実施する。
引数「deleteBeforeCopy=1」を行うと、コピー前に該当ファイルを削除する。

s flg = ##class(%File).CopyFile(from, to, deleteBeforeCopy) // flg=1:成功, 0:失敗

書く

ファイルに書き込む際は、「Open → Write(WriteLine) → Close」の流れで処理を実行します。
WriteLineは、末尾に改行コード($char(13,10))を付与する。

ClassMethod write(filePath As %String, text As %String, strMode As %String = "UTF8")
{
	try{
		s file=##class(%File).%New(filePath)
		$$$ThrowOnError( file.Open("WNU:/IOTABLE="""_strMode_""":10") )
		$$$ThrowOnError( file.Write(text) )
		d file.Close()
	}catch e{
		w !,$system.Status.DisplayError(e.AsStatus())
	}
}

比較する

ファイルの「内容」が一致しているか比較を行う。
 ※更新日時等は比較しない
内容が一致している場合、1が返る。

s flg = ##class(%File).Compare(file1, file2) // flg=1:成功, 0:失敗

リネームする

oldからnewへファイル名を変更する。

s flg = ##class(%File).Rename(old, new) // flg=1:成功, 0:失敗

作業用ファイルを作成する

拡張子を指定すると、作成したファイルに引数で渡した拡張子が付与される。
引数「dir」は、作成するディレクトリを指定する。

w ##class(%File).TempFilename("txt","D:\Temp\IRIS")
// D:\Temp\IRIS\xhTpVu1a.txt ←この時は「xhTpVu1a.txt」が作成された

s fileName = ##cla(%File).TempFilename([拡張子], dir)

取得関連

ディレクトリ名を取得する

s dir = ##class(%File).GetDirectory(fulPath) // ディレクトリ名取得

ファイル名を取得する

s fileName = ##class(%File).GetFilename(fulPath) // ファイル名取得

ファイル作成日時を取得する

horolog値で取得する

s datetime = ##class(%File).GetFileDateCreated(name) // ファイル作成日時取得

ファイル変更日時を取得する

horolog値で取得する

s datetime = ##class(%File).GetFileDateModified(name) // ファイル変更日時取得

ファイルサイズを取得する

単位はByte

s size = ##class(%File).GetFileSize(name) // ファイルサイズ取得

ドライブの空き容量を取得する

ドライブのサイズ(total)と空き容量(free)は、参照渡しで設定します。
第4引数は値の単位を指定します(0:Byte, 1:MB, 2:GB)。

// 参考 Dドライブの空き容量取得
s status = ##class(%File).GetDirectorySpace("D:\", .free, .total, 1)