Fileクラスを使って、ファイルのパスや中身を取得する方法を紹介する。File()を使うと、POSIXシンタックスでファイルパスを取得できる。POSIXとはスラッシュ(/)区切りのフォルダ階層表現であり、macOSとWindowsの違いを意識しないで済む。なので、できればファイルパスはPOSIXで表現したい。
ユーザが選択したフォルダの中にあるファイルをすべて読込みたい場合を例に説明しよう。
//zz_test_File
//20250924 wat
//ファイルオープンダイアログを表示、指定されたフォルダに含まれているファイルの中身を取得
C_TEXT($folder_Path; $file_path)
C_OBJECT($folder)
$folder:=New object
C_COLLECTION($files)
$files:=New collection
C_OBJECT($myFile)
$myFile:=New object
$folder_Path:=Select folder
$folder:=Folder($folder_Path; fk platform path)
$files:=$folder.files(fk recursive+fk ignore invisible)
For ($i; 1; $files.length)
//ファイル名を取得して配列に追加
$file_path:=$files[$i-1].path
$myFile:=File($file_path)
$fileText:=$myFile.getText("UTF-8"; Document with CR)
// do something
End for
ユーザにファイルまたはフォルダを選択させるときは、旧タイプのコマンド「Select folder」を使う。これらのコマンドはプラットフォームファイルパス(macOSとWindowsで与え方が異なるパス)を前提にしている。POSIXフォーマットは使えないが心配は無用だ。select folderの戻り値をそのままFolderコマンドに渡せばよい。オプションはfk platform path。
これまでは、Select folderしてからDOCUMENT LISTというコマンドを使っていた。指定したフォルダ内のファイル名が配列で返ってくる。このパターンを崩さないようにする目的でJCL_file_Listというメソッドを作った。次のように使う。
//zz_test_File2
//20250924 wat
//ファイルオープンダイアログ、フォルダパスはPOSIXファイルパス
C_TEXT($folder_Path; $file_path)
ARRAY TEXT($aryFile; 0)
C_LONGINT($i; $sizeOfAry)
C_OBJECT($myFile)
$myFile:=New object
$folder_Path:=Select folder
JCL_file_List($folder_Path; ->$aryFile)
$sizeOfAry:=Size of array($aryFile)
For ($i; 1; $sizeOfAry)
$file_path:=$aryFile{$i}
//ファイルの中身を取得
$myFile:=File($file_path)
$fileText:=$myFile.getText("UTF-8"; Document with CR)
End for
ALERT($file_path+Char(13)+$fileText)
やってみて思ったのだが、上のzz_test_Fileのように記述できてしまうので、zz_test_File2のようなパターンが必要かどうかは怪しい。