†REXXのどろぬま†

画像ファイルのみを処理する

拡張子列挙の代替処理

作成開始日 2014.01.17
最終更新日 2023.07.02

SysFileTreeは、ワイルドカード指定は可能だが、拡張子の列挙は受け付けない。たとえば、あるディレクトリ内の画像ファイル(*.JPG/*.PNG/*.GIF)を処理したい場合;
/* これでは受け付けない! */
rc=SysFileTree('*.jpg;*.png;*.gif',file,'FO')
ではダメ(コマンドラインのdirなどは、この列挙形式を受け付けるのだが)。それぞれの拡張子を指定して、SysFileTreeを3回実行する必要がある。
rc=SysFileTree('*.jpg',fileJ,'FO')
rc=SysFileTree('*.png',fileP,'FO')
rc=SysFileTree('*.gif',fileG,'FO')
で、この三つの配列(fileJ/fileP/fileG)を連結する処理が必要になる。だが、この処理はけっこう面倒でエレガントではない。

そこで、'*.*'ですべてのファイル名を取得したあと、拡張子で判別して、新しい配列を作り直す方が賢明かと。

/* 処理対象とするファイルの拡張子 */
img_ext='JPG PNG GIF JPEG BMP'

rc=SysFileTree('*.*',file,'FOS')

newFile.0=0
m=0
DO n=1 TO file.0
  PARSE UPPER VAR file.n body '.' ext	/* UPPERで大文字化 */
  IF POS(ext,img_ext)=0 THEN ITERATE
  m=m+1
  newFile.m=file.n
END
newFile.0=m
【注意】この方法では、パス名やファイル名にピリオド「.」が含まれていると正常に動作しない。その可能性がある場合は拡張子の識別を厳格にする必要がある。

【追記】もう一つ方法を思い付いた;「dir *.png *.jpg *.gif *.bmp *.jpeg /B」の出力をリダイレクトするなり、パイプで受け渡すなりすればいいんだ。バッチコマンドでも「for %f in (*.png *.jpg *.gif ...) do ...」形式は有効なようだし…工夫の仕方はあるな… (2023.07.02)


【REXXのどろぬま目次】 【ホーム】