ファイル選択ダイアログを表示して、ユーザにファイルを選択してもらう、という実装を紹介する。最近はやりのFileクラスと、昔からあるコマンドSelect document(ファイル選択ダイアログ)を使う。Fileクラスにはユーザインタフェースが用意されていないためだ。
File()を使うと、パスや中身をオブジェクト記法で取得できる。おまけにPOSIXシンタックスでファイルパスを取得できる。POSIXとはスラッシュ(/)区切りのフォルダ階層表現であり、macOSとWindowsの違いを意識しないで済む。以前のコマンドを使う場合、当社ではJCL_file_MakeFilePathというコマンドを用意してmacOSとWindowsの違いを吸収する努力をしてきた。そのときのコードとFile()のコードを比べてみるとたいして差はないのではあるが、POSIXはファイルパス形式がひとつなので可読性が上がり文字列操作が自由な感じになり、あとで修正するときに便利なのだ。できればファイルパスはPOSIXで表現したい。
ユーザが選択したファイルをすべて読込みたい場合を例に説明しよう。
//zz_test_select_document
//20260110 wat
C_OBJECT($myFile)
$myFile:=New object
C_TEXT($fileText)
$document_path:=Select document(111; ""; "PostgreSQLのDumpファイルを選択してください。"; 0)
$open_ok:=OK
If ($open_ok=1)
//システム変数Documentにプラットフォームパスが返されている
$myFile:=File(Document; fk platform path)
$fileText:=$myFile.getText("UTF-8"; Document with LF)
C_TEXT($m)
$m:=$m+"Document=["+Document+"]"+Char(13)
$m:=$m+"path=["+$myFile.path+"]"+Char(13)
$m:=$m+"contents=["+Substring($fileText; 1; 100)+"]"
ALERT($m)
End if
ユーザにファイルまたはフォルダを選択させるときは、旧タイプのコマンド「Select folder」を使う。これらのコマンドはプラットフォームファイルパス(macOSとWindowsで与え方が異なるパス)を前提にしている。POSIXフォーマットは使えないが心配は無用だ。select folderの戻り値をそのままFolderコマンドに渡せばよい。オプションはfk platform path。
これまでは、Select folderしてからDOCUMENT LISTというコマンドを使っていた。指定したフォルダ内のファイル名が配列で返ってくる。このパターンを崩さないようにする目的でJCL_file_Listというメソッドを作った。次のように使う。