スペースさんの返信にある通り、やるべきことは次の2つです。
1. 指定されたディレクトリ以下の、すべてのディレクトリをみつける。
2. みつけた各ディレクトリで、dirlist _, "*.txt" を使ってファイルを探す。
2はただのループなので簡単。1を説明します。
(再帰関数を定義すれば短く書けますが、再帰関数はややトラップが多めですし、
ここではループとスタックを使う方法を説明します。)
まず、あるディレクトリ dir の真下にあるディレクトリは、dirlist 命令で次のように探せます。
// _ には適当な変数名を書く
dirlist _, dir + "/*", 5
ここで発見した各ディレクトリについて、再び上と同じことをする必要があります。
つまり↑に書いた dirlist を何度も行うということなので、これをループします。(何回行うかは分からない)
repeat
dirlist _, dir + "/*", 5
//略
loop
発見したディレクトリは保存しておく必要があります。配列変数 dir_stk に入れることにしましょう。
dir_stk は、「発見したけれど、まだその下のディレクトリを探していない」ようなディレクトリの一覧になります。
ループ1回につき1つのディレクトリを探すので、dir_stk が 1 短くなります。
最終的に dir_stk の長さが 0 になれば、検索完了。
ちなみにHSPでは配列を短くしたり長さ 0 にしたりできません。そのため dir_stk の長さを変数で管理しておく必要があります。
sdim dir_stk
dir_stk(0) = dir_cur // 最初に探すディレクトリ
dir_stk_len = 1 // 配列変数 dir_stk の長さを表すのに使う変数
repeat
if ( dir_stk_len == 0 ) { break }
//dir_stk から、ディレクトリを1つ取り出す (次にここを探すということ)
dir = dir_stk(dir_stk_len - 1)
dir_stk_len --
dirlist note, dir + "/*", 5
note_count = stat
//dir 直下で発見したディレクトリが変数 note に入る
//note のそれぞれを dir_stk に入れていく
repeat note_count
//d: noteの cnt 行目、とする (*)
// これを dir_stk に追加する
dir_stk(dir_stk_len) = dir + "/" + d
dir_stk_len ++
loop
loop
(*)の部分は
> 配列変数にファイル名を切り分けて代入
です。
split 命令という専用の命令もありますが、空("")の要素が出てきてしまうのには注意。
あるいは、getstr で切り分けていくという手もあります。これが一番効率的。