†REXXのどろぬま†

再帰的ディレクトリ構造検索

作成開始日 2016.09.16
最終更新日 2016.09.16

通常、ディレクトリ構造のリストを取得するには、SysFileTree('*.*',dirs,'DOS')を使えば良い。しかし、ウチのサーバでこれを実行すると、シャレにならないレベルの時間が掛かる。ローカルならば瞬時に取得できるレベルでも、30分とか1時間とかダンマリである。コマンドラインのDIR /Sでも同じようになる。したがって、DIR ABC*.TXT /Sといった、ごく基本的な検索コマンドすら気軽には使えない。

流石にこれでは不便なので、ディレクトリ構造を取得するスクリプトを作って、途中経過を表示させることにした。処理時間が同じでも、進捗状況が見えれば気が楽になる。ポイントは、ディレクトリの深さ(階層)は不定かつ未知であること。したがって、予め決まった深さのループで処理するわけにいかない。どうしても、再帰的なプログラミングが必要になる。

再帰的なアルゴリズムでは、変数のローカル化がきちんとできているか否かが重要なポイントになる。自分自身を呼び出したときに、変数領域がバッディングしてしまうと再帰処理が壊れる。まっとうな言語であれば全く気にすることはないが、簡易的なスクリプト言語であるREXXでそれが可能かどうか…が、一番の気掛かりだったのだが、結果的には上手く行っているようだ。

/* 再帰的ディレクトリ構造検索 */
Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
Call SysLoadFuncs

CALL RecurDirs('*.*')

EXIT

RecurDirs: PROCEDURE;
  dpath=arg(1)
  rc=SysFileTree(dpath, dirs, 'DO')
  Do n=1 to dirs.0
    SAY dirs.n
    CALL RecurDirs(dirs.n'\*.*')
  End
RETURN 0;


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