Last Update : 2007/04/xx
フォルダ(ディレクトリ)やファイルの一覧を取得できる命令です。命令名の由来は、「directory list」から。
この命令の特徴は、何といってもマスク指定。マスクには、ファイルやフォルダ(ディレクトリ)のパスを指定します。たとえば、ある特定のフォルダ内に存在するファイルで、拡張子を限定させた一覧リストを取得できます。
dirlist リストが格納される文字列型変数, "マスク", 取得モード
取得したリストは、第1パラメータの変数に格納されます。内容はファイルやディレクトリごとに「\n」の改行で区切られているので、note〜系命令(メモリノートパッド)で扱いやすいようになってます。システム変数statには、取得したファイルやフォルダの総数が返ります。(この部分はHSP 3.0〜3.0aにバグがあり、HSP 3.1で修正済み)
第2パラメータは、下に挙げた取得モードです。取得する形式が、ファイルかフォルダかファイルとフォルダの両方かを限定できます。
取得モード | ||||
モード | ファイル | フォルダ (ディレクトリ) | ||
通 常 | 隠し属性 システム属性 |
通 常 | 隠し属性 システム属性 |
|
0 | ● | ● | ● | ● |
1 | ● | ● | - | - |
2 | ● | - | ● | - |
3 | ● | - | - | - |
5 | - | - | ● | ● |
6 | - | ● | - | ● |
7 | - | ● | ● | ● |
・隠し属性 ...
「隠しファイル」と「隠しフォルダ」になっているもので、属性はプロパティダイアログで変更できます。Windowsのデフォルト設定では表示されないようになっているので、エクスプローラの[ツール]→[フォルダオプション]をクリックし、[表示]タブの[詳細設定]にあるツリー項目「ファイルとフォルダの表示」→「すべてのファイルとフォルダを表示する」で切り替えできます。
・システム属性 ... Windowsのシステムで使われるファイルやフォルダ。上の設定とともに、ツリー項目の「保護されたオペレーティング
システム ファイルを表示しない (推奨)」を無効にすることで表示されるようになります。ただ、この属性を持つファイルは削除も一定の手順を踏まないと実現できないなど、通常は気にする必要がないものです。
★ もうひとつの機能
dirlist命令には、フォルダ(ディレクトリ)が存在しているかどうかをチェックする機能も持ってます。これを言い換えれば、指定したパスがファイルなのかフォルダなのかの識別判定も可能です(→
HSP3 あれこれ フォルダ)。ファイルの存在を確認するexist命令のフォルダバージョンといったところ。dirlist命令がサポートする機能をまとめると下のようになります。
文章だけでは、いまいち説明できないので、実例的なコードを挙げてみます。HSP3のスクリプトエディタ上でのコンパイル実行を想定してます。
まずは、実行ファイルのあるフォルダにある実行ファイルの一覧を表示してみます。ワイルドカード文字「*」(アスタリスク)を利用して「*.exe」とすることで実行ファイルの拡張子を持つファイルだけが返ってきます。「(うんたらかんたら).exe」というファイル名です。(「*.*」と指定する、あるいは省略した場合は全ファイルが対象)
; リストが返る変数用のバッファ領域を必ず確保! sdim list, 256 dirlist list, "*.exe", 1 mes list
特定のフォルダの場合は次のような感じです。HSP本体の「docs」フォルダにあるHTMLファイル(*.htm)。あらかじめchdir命令でカレントフォルダを「docs」フォルダに移動させておく方法でもOKです。
// フォルダも含んだパスを指定する sdim list, 256 dirlist list, "docs\\*.htm", 1 mes list
// カレントフォルダを移動させる sdim list, 256 chdir "docs" dirlist list, "*.htm", 1 mes list
パスの区切りは円記号2つ「\\」で認識します。『プログラミングマニュアル1・基本仕様ガイド (hspprog.htm)』の「2.スクリプト記述の基本→文字列」を参照。
次のような限定もできます。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
(1) マスク指定にクエスチョンマーク
上では触れていませんが、ワイルドカード文字は「*」のほかに、「?」(クエスチョンマーク・疑問符)も利用できます。「*」は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) ポイント
単純にマスク指定を「*.*」と指定すると、場合によっては不要なファイルやフォルダまでも取得することになります。取得した個数が多ければ多いだけその後の処理量が増えるので、マスク指定と第2パラメータの取得モードをうまく利用して、「取得するリストはあらかじめ絞れるだけ絞っておく」のがポイントです。
あと、dirlist命令の第1パラメータの文字列変数に関して。この変数用のバッファをsdim命令であらかじめ大きめに確保しておくことをお忘れなく。HSPには変数領域サイズの「自動拡張機能」というのが用意されておりバッファオーバーフローエラーを回避しますが、この機能にべったり頼ると動作パフォーマンスにモロに響きます。中身を維持したままバッファサイズだけ拡張できるmemexpand命令もあります。