ファイルに関連するスクリプトステップ
バージョン 18 から外部のファイルを操作できるスクリプトステップが大量に追加されています。
データファイル○○○ となっていても別にテキストファイルだけでなく、
画像や.fmp12ファイルなど形式はなんでも操作が可能になっています。
これらを使えばファイルをリネーム、削除、サイズを取得したりできますし、
新たなファイルを作成したり、FileMaker へ取り込んだりできます。
- ファイルの存在を取得
- ファイルサイズを取得
- ファイルの名前変更
- ファイルを削除
- データファイルを作成
- データファイルを開く
- データファイルを閉じる
- データファイルから読み取る
- データファイルに書き込む
- データファイルの位置を取得
- データファイルの位置を設定
サーバー上でも実行可能なのが良いところ
通常ファイルの取り込みや吐き出しは従来から、
ファイルを挿入、フィールド内容のエクスポートなどのスクリプトステップが使用できます。
しかしこれらのスクリプトステップはサーバー上での実行では使用できません。
サーバー上での実行とは次のような場面です。
- サーバー上のスクリプト実行
- スケジュールによるスクリプト実行
- Data API によるスクリプト実行
冒頭にリストアップしたファイルに関連するスクリプトステップは、
これらのどこでも実行が可能なので良いところです。
64MBの壁
ファイルを FileMaker 側に取り込む「データファイルから読み取る」も、
FileMaker 内のデータをエクスポートする「データファイルに書き込む」も、
1回のスクリプトステップの実行では最大64MBまでの処理しかできない仕様になっています。
64MBを越える場合は複数回読み込めとヘルプには書いてあるものの、
複数回読んだ後どうやって結合するかのTipsがどこにも書いていないので、
投稿したしだいです。
データファイルから読み取る を 64MB ずつ取り込んで 結合する
データファイルから読み取る スクリプトステップはサイズを指定することができます。
ここは 64MB 、MiBではないので、数値としては 64000000 を指定します。
そして読み取るのオプションは「バイト」を選択してください。
取り込んだものはオブジェクト型のファイルになっていますので、
変数に格納するか、オブジェクトフィールドに格納しましょう。
たとえば100MBのファイルがあったら、
1回目は64MB、2回目は36MBのファイルになります。
そして複数に分割されたものを1つのファイルとして結合するには HexEncode 、 HexDecode 関数を使用します。
例えば 1回目64MBのファイルは $obj1 変数に、2回目の36MBのファイルが $obj2 変数に入っている場合、
次の計算式で 複数のファイルを結合して1つのファイルが完成し、
64MBの制限がなければ1回で取り込みたかった本来のファイルになります。
HexEncode ( HexDecode ( $obj1 ) & HexDecode ( $obj2 ) ; GetContainerAttribute ( $obj1 ; “filename” ) )
データファイルに書き込む を 64MB ずつ書き込む
データファイルから読み取る を使ってもともと 64MB 以下のファイルの状態であれば、
それを順番に データファイルに書き込む スクリプトステップを実行することで1つのファイルをエクスポートできます。
また FileMaker のオブジェクトフィールドにある 64MB以上の1つのファイルを 64MB ずつ書き込むケースもありますね。
たとえばオブジェクトフィールド table::obj に100MBのファイルがあったとします。
64MB 、 36MB のバイトデータを取り出すにも HexEncode 、 HexDecode 関数を使用します。
HexDecode ( Middle ( HexEncode (table::obj ) ; 1 ; 64000000 *2 ) ; “a” )
HexDecode ( Middle ( HexEncode (table::obj ) ; 1 + 64000000 *2 ; 64000000 *2 ) ; “a” )
この2つをそれぞれ データファイルに書き込む スクリプトステップで1つのファイルをエクスポートできます。
サンプルファイルの解説
サンプルファイルはこちらからダウンロードできます
サンプルファイルが完全に動作する条件は次の通りです。
- Claris FileMaker 18 以上