命令講座 <dirlist命令>

Last Update : 2007/04/xx

dirlist命令 (ファイル名・フォルダ名の一覧取得)

 フォルダ(ディレクトリ)やファイルの一覧を取得できる命令です。命令名の由来は、「directory list」から。

 この命令の特徴は、何といってもマスク指定。マスクには、ファイルやフォルダのパスを指定します。たとえば、ある特定のフォルダに存在するファイルで、拡張子を限定した一覧リストを取得することができます。

 dirlist リストが格納される文字列型変数, "マスク", 取得モード

 取得した一覧リストは、第1パラメータの変数に格納されます。その内容は、ファイルやディレクトリごとに「\n」改行で区切られているので、note〜系命令(メモリノートパッド)で扱いやすいようになっています。システム変数statには、取得したファイルやフォルダの総数が返ります。(※この部分でHSP 3.0 〜 3.0aにバグあり?、HSP 3.1で修正済み)

 第2パラメータは、下に挙げた取得モードです。取得する形式が、ファイルかディレクトリか両方か、をさらに限定できます。

取得モード
モード ファイル フォルダ (ディレクトリ)
通   常 隠し属性
システム属性
通   常 隠し属性
システム属性
- -
- -
- - -
- -
- -
-

・隠し属性 ... 「隠しファイル」と「隠しフォルダ」になっているもので、属性はプロパティで変更できます。Windowsのデフォルト設定では、表示されないようになっているので、エクスプローラの[ツール]→[フォルダオプション]をクリックし、[表示]タブの[詳細設定]にあるツリー項目「ファイルとフォルダの表示」→「すべてのファイルとフォルダを表示する」で切り替えできます。
・システム属性 ... Windowsのシステムで使われるファイルやフォルダ。上の設定とともに、ツリー項目の「保護されたオペレーティング システム ファイルを表示しない (推奨)」を無効にすることで、一応表示されるようになりますが、この属性を持つファイルは、削除も一定の手順を踏まないと実現できないなど、通常は気にする必要のないものです。

★ もうひとつの機能
 dirlist命令には、フォルダ(ディレクトリ)が存在しているかをチェックする機能も持ってます。また、これを言い換えれば、指定したパスがファイルかフォルダかの判定も可能です。ファイルの存在を確認するexist命令のフォルダバージョンといったところです。(→ HSP3 あれこれ フォルダ編

^

サンプルコード (ファイル関連)

 文章だけでは、いまいち説明できないので、実例的なコードを挙げてみます。HSP3のスクリプトエディタ上でのコンパイル実行を想定してます。

 まずは、実行ファイルのあるフォルダにある実行ファイルの一覧を表示してみます。ワイルドカード文字「*」(アスタリスク)を利用して「*.exe」とすることで実行ファイルの拡張子を持つファイルだけが返ってきます。「(うんたらかんたら).exe」というファイル名のものです。(「*.*」と指定したら全ファイル)

;	リストが返る変数用の領域を必ず確保!
	sdim list, 256

	dirlist list, "*.exe", 1

	mes list

 特定のフォルダの場合は次のような感じです。HSP本体の「docs」フォルダにあるHTMLファイル(*.htm)です。chdir命令でカレントフォルダを「docs」フォルダに移動させておく方法でもいいでしょう。

	sdim list, 256

	dirlist list, "docs\\*.htm", 1

	mes list
	sdim list, 256

	chdir "docs"
	dirlist list, "*.htm", 1

	mes list

 次のような限定もできます。HSP本体の「docs」フォルダにあるテキストファイル、かつファイル名が「hsp〜」で始まっているもの。つまりは、「hsp(うんたらかんたら).txt」という名前のテキストファイルだけです。

	sdim list, 256

	dirlist list, "docs\\hsp*.txt", 1

	mes list

 HSP本体の「docs」フォルダにあるファイル、かつ拡張子関係なくファイル名が「hsp〜」で始まっているもの。

	sdim list, 256

	dirlist list, "docs\\hsp*.*", 1

	mes list

 もし、ファイルの種類が複数ある場合は、その分のdirlist命令を呼んで、最終的に結果を結合する形になります。HSP本体の「docs」フォルダにあるJPEGファイルとGIFファイル。

	sdim list1, 256
	sdim list2, 256

	dirlist list1, "docs\\*.jpg", 1
	dirlist list2, "docs\\*.gif", 1

	mes list1 + list2

^

サンプルコード (フォルダ関連)

 フォルダ(ディレクトリ)の取得です。ファイルと同じですな。

 HSP本体の「sample」フォルダの中にあるフォルダ一覧。そして、「hsp〜」という名前で始まるフォルダ。

	sdim list, 256

	dirlist list, "sample\\*", 5

	mes list
	sdim list, 256

	dirlist list, "sample\\hsp*", 5

	mes list

 指定したフォルダの更に深い階層(サブフォルダ)にあるファイルのリスト化はdirlist命令一発では無理です。フォルダの中にあるフォルダ内のファイルをリスト化するには、その分のdirlist命令を呼びます。(拡張プラグインHSPEXT.dllには、拡張版のdirlist2命令というのも用意されています。)

	notesel folderlist

;	フォルダ取得
	dirlist folderlist, "sample\\*", 5

;	たとえば、フォルダリストの2行目(インデックス番号1)を取り出す
	noteget foldername, 1
	mes foldername

	sdim filelist, 256

;	hspファイル取得
	dirlist filelist, "sample\\"+foldername+"\\*.hsp", 1
	pos 10
	mes filelist

^

補足情報

 上では触れていませんが、ワイルドカード文字は「*」のほかに、「?」(クエスチョンマーク・疑問符)が利用できます。「*」は0個以上の文字の代用となっているのに対して、「?」は1文字分の代用として機能します。

 HSP本体の「common」フォルダにあるASファイル、かつファイル部分が5文字以内に収まっているもの。その下は「*.htm」と「*.html」の両方を取得できることになります。

	sdim list, 256
	dirlist list, "common\\?????.as", 1

	mes list
	sdim list, 256
	dirlist list, "docs\\*.htm?", 1

	mes list

- - - - -

 マスク指定を単純に「*.*」だと、場合によっては必要ないファイルやフォルダまでも取得することになり、処理スピードに響く可能性があります。マスク指定、第2パラメータの取得モードをうまく利用して、「取得する一覧をあらかじめ絞っておく」のがポイント!

 ついでに、dirlist命令の第1パラメータの文字列変数に関して。この変数用の領域をsdim命令であらかじめ大きめにバッファを確保しておくことをくれぐれもお忘れなく。HSPには変数領域サイズの「自動拡張機能」というのが一応用意されていますが、この機能にべったり頼ると動作パフォーマンスにモロに響くので注意が必要です。

^

Copyright © 2005-2008 HSP情報サイト Let's HSP!. All rights reserved.