
クラス「%Library.File.cls」のAPIをまとめました。
クエリ系
ファイル検索
適宜修正してご利用ください。
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)