ファイルの列挙



あるディレクトリの中にあるファイルの名前を全て取得するにはdirlist命令があります。
しかしそのディレクトリ以下の全てのファイル、つまりサブディレクトリの中のファイルまで全て取得するには、 hspext.dllのdirlist2命令を使うことになります。
私のような拡張DLLを使いたくない人にとってこれは大きな問題となります。
そこで標準命令でサブディレクトリの中まで調べる方法を考えてみました。
サブディレクトリまでの全てのファイルを列挙するには、まずディレクトリ内の全てのサブディレクトリのパスを取得すればいいのです。
ディレクトリのパスさえあれば、後は普通にdirlist命令でファイルを取得すれば可能です。
全てのディレクトリを調べる方法はこうです。

1.親ディレクトリ(調べる内の一番上のディレクトリ)中のディレクトリを全て取得
2.取得したディレクトリをリストに追加
3.リストに追加されたディレクトリに対して同じ動作を行う
4.3を繰り返す
5.リストの最後まで行ったら終了

というわかりづらい過程。
ここで使用する「リスト」というのは次々とディレクトリ名が追加されていく動的なものなので メモリーノートパッド命令を使います(noteadd命令は自動でメモリを確保してくれることを利用して)。

ディレクトリリストを取得するdirlist命令はそのディレクトリ名のみを取得するので、階層を自分で作ったりとめんどくさいことがあるので、ソースは少々複雑になってしまいます。 以下がそれらをまとめたソースです。

	sdim dir,1024
	dir=curdir	;デフォルトはカレントディレクトリ
	pos 0,0 : input dir,winx-80,20,1024	;検索ディレクトリ取得ボックス
	objsize 80,20 : pos winx-80,0 : button "検索",*find	;検索開始ボタン
	files=""
	objsize winx,winy-20 : pos 0,20 : listbox dummy,0,files	;リスト表示リストボックス
	stop

*find	;検索開始
	title "検索中…"
	sdim files,64	;変数初期化

	;指定ディレクトリ以下の全ディレクトリを取得

	directrys=""	;全ディレクトリを格納する変数
	notesel directrys
	noteadd ""	;親ディレクトリの分

	repeat
		list=""	;サブディレクトリリスト
		directry=""
		noteget directry,cnt	;調べるディレクトリ
		dirlist list,dir+"\\"+directry+"\\*.*",5	;ディレクトリリストを取得
		dirnum=stat
		byte=0
		repeat dirnum
			getstr dirname,list,byte	;取得したリストから1行取得
			byte+strsize	;1行分進める
			if directry="" {	;親ディレクトリはこっち
				noteadd dirname
			} else {	;それ以外
				noteadd directry+"\\"+dirname
			}
		loop
		notemax max
		if max-1=cnt : break	;全てのディレクトリを調べたら終了
		await
	loop

	;それぞれのディレクトリからファイルをリストアップ

	notesel files	;ディレクトリの方はもう必要ないので
	byte=0
	repeat max
		getstr dirname,directrys,byte
		byte+strsize
		dirlist list,dir+"\\"+dirname+"\\*.*",1
		byte2=0
		repeat stat
			getstr filename,list,byte2
			byte2+strsize
			if dirname="" {
				noteadd filename
			} else {
				noteadd dirname+"\\"+filename
			}
		loop
	loop

	objprm 2,files	;リストボックスに更新
	title "検索終了"
	stop

上のインプットボックスにディレクトリパスを入力して検索ボタンを押すとディレクトリ以下にある全てのファイルを下のリストボックスに表示します。
ディレクトリパスは自分で入力してください。フォルダ選択ダイアログはhspext.dllを使うかAPIを使うかしなきゃいけないのでめんどくさいです。

どうでしょう?ちゃんと列挙されましたか?一部sdimで定義されていない部分があるので、階層が深くなると正常に動かないかもしれません。


戻る