[an error occurred while processing this directive] [an error occurred while processing this directive]


プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









逆引きCache' Object Script

Cache' Object Script

文字列 数値 ファイル 日時 ユーティリティ

ファイル

テキストファイルを読む

テキストファイルを読む処理は、次のように書くことが多いです。
「★処理を記述」 の部分で、読み込んだ1行ごとの内容が変数lineに入った状態になっているので、必要な処理を記述します。
  Set fn="C:\test.txt"
  Set $ZT="error"

  Open file:("RS"):1 //ファイルを開く
  If '$Test { //1秒以内に開けなかった
    //エラー処理を記述
    Write "ファイルのオープンに失敗しました"
    Quit


  Do ##class(%SYSTEM.Process).SetZEOF(1) //このプロセスで$ZEOF検出を有効にする
  While '$ZEOF {
    Use file Read line Quit:$ZEOF
     
    //★処理を記述
  }
  Do ##class(%SYSTEM.Process).SetZEOF(0) //ZEOF無効
  Close file
  Quit

error 
  Set $ZTrap=""
  Close file
  Do ##class(%SYSTEM.Process).SetZEOF(0) //ZEOF無効
  
  //エラー処理を記述
  Write "エラーが発生しました ",$ZError,!
  Quit

テキストファイルを読む際に終端をエラートラップ以外の方法で取得

デフォルトではファイルの終端で読込みを行うと<ENDOFFILE>エラーが発生することでファイルを最後まで読み取ったことを知りますが、 Do ##class(%SYSTEM.Process).SetZEOF(1) して、ファイル終端になると$ZEOF=1となることで検出することができます。
または、構成マネージャ→詳細→その他→<ENDOFFILE>エラーの代わりに$ZEOFを設定する をオン にします。

テキストファイルを書く

Set fn="C:\test.txt"
Open fn:"NWS":3 Else Write "ファイルのオープンに失敗" Quit  //3秒以内に開けなかった
Use fn
Write dat
Close fn
Quit
追加は"NWS"を"AWS"にする。

標準の文字コード以外のテキストを処理する

  1. Open fn:"K\EUC\"のようにコードを指定する
  2. Set rev=$$SetIO^%NLS("EUC") のようにコードを指定する
  3. バイナリモード(Open fn:"K\BIN\")で読み取り、必要な部分だけ$ZCVT(data,"I","EUC")のように変換する
使用できる変換テーブルはDo Dump^%NLSMISCで表示されます。
標準の文字コードはNLSとデバイスによって決定されます。
変換テーブルの追加も、bin\CNLS.exe→テーブルの追加からできそうです。

ファイルの存在確認

##class(%File).Exists(fullpath) を使用します。
If ##class(%File).Exists("C:\autoexec.bat")="" {
  Write "ファイルがあります",!
} Else {
  Write "ファイルがありません",!
}
ディレクトリの存在確認は、##class(%File).DirectoryExists(fullpath) です。
$ZSEARHコマンドは閉じる処理を忘れがちなので、使用しないほうが良いでしょう。
$ZUtil(140,4,fn)などでも可能です

フルパスからファイル名の取得

##Class(%File).GetFilename(fullPath)を使用します。
> Write ##Class(%File).GetFilename("C:\Program Files\Office\winword.exe")
winword.exe

ファイルの削除

##Class(%File).Delete(fullPath)を使用します。

もしくは CloseのDオプションで削除できます。Closeするためには、Openしておく必要があります。
 Set file="C:\1.txt"
 Open file
 Close file:("D")
ファイルはフルパスで指定するようにして下さい。

ファイル名の変更 / ファイルの移動

CloseのRオプションで名前変更やファイルの移動が可能です。Closeするためには、Openしておく必要があります。
 Set file="C:\1.txt", file2="C:\2.txt"
 Open file
 Close file:("R":file2)

 Set file3="D:\temp\3.txt"
 Open file2::1                                // Openのタイムアウト指定1秒
 If $TEST=0 Write file2_"を開けません" Quit   // Openでタイムアウトが発生したら、メッセージを表示して終了
 Close file2:("R":file3)
ファイルはフルパスで指定するようにして下さい。

一時ファイル名の取得

##Class(%File).TempFilename()を使用します。
拡張子を指定したい場合は引数にセットします。
 Write ##class(%File).TempFilename()
  > C:\InterSystems\Cache\Mgr\Temp\2940oYoj1.tmp	// 拡張子指定しない場合は .tmp
 
 Write ##class(%File).TempFilename("txt")
  > C:\InterSystems\Cache\Mgr\Temp\2940WIDT2.txt
ファイルはOSのテンポラリフォルダではなく、 Cacheインストールディレクトリ\Mgr\Tempに作成されます。

ファイルのハッシュ値を取得

ストリームを経由してハッシュ値を取得できます。
> Set sid=##class(%FileCharacterStream).GetStreamIdForFile("C:\test.txt")
> Set stm=##class(%FileCharacterStream).%Open(sid)
> Set bs=$SYSTEM.Encryption.SHA1HashStream(stm)
> Write bs
ïà 
ú¤Ðw7w©¡d
     // バイト文字列なので文字化けしています、16進文字列にするには以下の方法で
> Set hexStr="" For i=1:1:$L(bs) Set hexStr=hexStr_$TR($J($ZHEX($A($E(bs,i))),2)," ",0)
> Write hexStr
B4C31C856EF8420FAA49BF8D07773777A9A164	// SHA-1ハッシュ値 16進文字列

// MD5の場合
> Set bs=$SYSTEM.Encryption.MD5HashStream(stm)  // stmは上で取得している
> Set hexStr="" For i=1:1:$L(bs) Set hexStr=hexStr_$TR($J($ZHEX($A($E(bs,i))),2)," ",0)
> Write hexStr
1B4AEA199D581C8084B41A1F2C581AA

ver2013以降、SHA1用のメソッドが追加されました。こちらの方法だとストリームを用意する必要がないので楽です。
USER>Write ##class(%File).SHA1Hash("C:\test.txt")
ïà 
ú¤Ðw7w©¡d
     // バイト文字列なので文字化けしています、16進文字列にするには上の方法か、
USER>Write ##class(%File).SHA1Hash("C:\test.txt", 1) //第二引数に1をセットします。
B4C31C856EF8420FAA49BF8D07773777A9A164

ファイルの属性取得

##class(%File)を使用します。
ファイルサイズ ##class(%File).GetFileSize(フルパス)
修正日時         ##class(%File).GetFileDateModified(フルパス)
作成日時         ##class(%File).GetFileDateCreated(フルパス)
属性ビットマップ ##class(%File).Attributes(フルパス)
 属性で取得できるのは、読み込み専用・隠しファイルなどです。

もしくは $ZUtil(140,n)を使用します。オプションはヘルプを参照してください。
Set fn="C:\1.txt"
Write "ファイルサイズ  ",$ZUtil(140,1,fn),"byte",!
Write "修正日時     ",$ZDT($ZUtil(140,2,fn),3),!
Write "作成日時     ",$ZDT($ZUtil(140,3,fn),3),!
Write "属性ビットマップ",$ZUtil(140,7,fn),!

その他の処理

ファイル(ディレクトリ)周りの処理は$ZF(-1,cmd)でOSのコマンドを実行することで、たいていのことが可能です。
Set rev=$ZF(-1,"DELETE C:\1.txt")	//ファイル削除
Set rec=$ZF(-1,"MKDIR C:\worktemp")	//ディレクトリ作成
Set rec=$ZF(-1,"dir /s/b C:\windows\system32\*.exe > C:\1.txt")
	//条件に一致するファイル一覧の作成
リダイレクトなどを組み合わせれば、いろいろなことが楽にできます。

アクセスできないときサービスからCache'の起動ユーザーを確認した例

ファイルにアクセスできないというときは、ファイルのアクセス権について確認してください。
windowsの場合、Cache'は通常"ローカルシステムアカウント"で起動しています。
このユーザに対象ファイルのアクセス権がない場合、各種ファイル操作は失敗してしまいます。 特に他のマシンの共有を見るような場合にご注意下さい。
Cache'がどのアカウントで起動しているかは、マイコンピューターを右クリック→管理→サービスとアプリケーション→サービス→Cache'を右クリック→プロパティ→ログオン から確認できます。


[an error occurred while processing this directive] [an error occurred while processing this directive]