フォルダに関する情報
今回は「フォルダに関する命令・関数、システム変数について」紹介します。

以前にカレントフォルダを示すdir_curや、実行ファイルの場所を示すdir_exeマクロを紹介しました。
マクロでは他に、デスクトップのパスを取得するdir_desktopや、
マイドキュメントを示すdir_mydoc、Windowsフォルダを示すdir_win、
システムフォルダを示すdir_sys、コマンドライン文字列を示すdir_cmdlineが用意されています。
HSP2以前はマクロではなく、システム変数として用意されており、
取得できるものも上記のうちの一部だけでした。
HSP3からは、これらのマクロの実体が標準関数として用意されているのです。

取得パス = dirinfo(取得タイプ)
取得パス取得タイプで指定したパス、またはコマンド文字列が返る。
取得タイプ 0:カレントフォルダ(dir_curと同じ)
1:実行ファイルのあるフォルダ(dir_exeと同じ)
2:Windowsフォルダ(dir_winと同じ)
3:システムフォルダ(dir_sysと同じ)
4:コマンドライン文字列(dir_cmdlineと同じ)
0x10000(65536)以上はCSIDLとして、システムが管理するパスを取得する
自分の環境ではWindowsフォルダが「C:\Windows\」であっても、 他人のパソコンではDドライブであったり、そもそもフォルダ名が違っているかもしれません。 カレントディレクトリ以外のフォルダに移動したり操作したりする場合は、 このDIRectoryINFOrmationの略であるdirinfo関数で取得したパスを使用するようにしましょう。 取得タイプ0〜4は上に記載した通りで、0x10000(16)以降の使用できる値・パスは下記の通りで、 10進数値かID値に0x10000足した値(CSIDL_PROGRAMS(=0x0002)なら0x10002)を指定します。
10進数CSIDLID値取得パス備考
65536CSIDL_DESKTOP0x0000デスクトップ
---CSIDL_INTERNET0x0001Internet Explorer取得不可
65538CSIDL_PROGRAMS0x0002スタートメニューのプログラム
---CSIDL_CONTROLS0x0003コントロールパネル取得不可
---CSIDL_PRINTERS0x0004プリンター取得不可
65541CSIDL_PERSONAL0x0005マイドキュメント(All Users)
65542CSIDL_FAVORITES0x0006お気に入り
65543CSIDL_STARTUP0x0007スタートメニューのスタートアップ
65544CSIDL_RECENT0x0008最近使ったファイル
65545CSIDL_SENDTO0x0009SendTo
---CSIDL_BITBUCKET0x000Aごみ箱取得不可
65547CSIDL_STARTMENU0x000Bスタートメニュー
---CSIDL_MYDOCUMENTS0x000CマイドキュメントXP〜?
65549CSIDL_MYMUSIC0x000DマイミュージックXP〜
65550CSIDL_MYVIDEO0x000EマイビデオXP〜
------0x000F参考資料が見つからない取得不可?
65552CSIDL_DESKTOPDIRECTORY0x0010デスクトップ
---CSIDL_DRIVES0x0011マイコンピュータ取得不可
---CSIDL_NETWORK0x0012ネットワークコンピュータ取得不可
65555CSIDL_NETHOOD0x0013NetHood
65556CSIDL_FONTS0x0014フォント
65557CSIDL_TEMPLATES0x0015Templates
65558CSIDL_COMMON_STARTMENU0x0016スタートメニュー(All Users)NT4〜?
65559CSIDL_COMMON_PROGRAMS0x0017スタートメニューのプログラム(All Users)NT4〜?
65560CSIDL_COMMON_STARTUP0x0018スタートメニューのスタートアップ(All Users)ME〜
65561CSIDL_COMMON_DESKTOPDIRECTORY0x0019デスクトップ(All Users)ME〜
65562CSIDL_APPDATA0x001AApplication DataIE4.71〜
65563CSIDL_PRINTHOOD0x001BPrintHood98〜
65564CSIDL_LOCAL_APPDATA0x001CApplication DataME〜 (NT4は×)
65565CSIDL_ALTSTARTUP0x001DスタートアップVista〜
65566CSIDL_COMMON_ALTSTARTUP0x001EスタートアップVista〜
65567CSIDL_COMMON_FAVORITES0x001Fお気に入り(All Users)2000〜
65568CSIDL_INTERNET_CACHE0x0020Temporary Internet Files
65569CSIDL_COOKIES0x0021Cookies
65570CSIDL_HISTORY0x0022履歴
65571CSIDL_COMMON_APPDATA0x0023Application Data(All Users)ME〜 (NT4は×)
65572CSIDL_WINDOWS0x0024WindowsME〜 (NT4は×)
65573CSIDL_SYSTEM0x0025System32ME〜 (NT4は×)
65574CSIDL_PROGRAM_FILES0x0026Program FilesME〜 (NT4は×)
65575CSIDL_MYPICTURES0x0027マイピクチャー(All Users)ME〜 (NT4は×)
65576CSIDL_PROFILE0x0028Profiles2000〜
65577CSIDL_SYSTEMX860x0029System32ME〜 (NT4は×)
65578CSIDL_PROGRAM_FILESX860x002AProgram FilesVista〜
65579CSIDL_PROGRAM_FILES_COMMON0x002BCommonME〜 (NT4は×)
65580CSIDL_PROGRAM_FILES_COMMONX860x002CCommonVista〜
65581CSIDL_COMMON_TEMPLATES0x002DTemplates(All Users)2000〜
65582CSIDL_COMMON_DOCUMENTS0x002Eマイドキュメント(All Users)ME〜 (NT4は×)
65583CSIDL_COMMON_ADMINTOOLS0x002Fスタートメニューのプログラムの管理ツール(All Users)2000〜
65584CSIDL_ADMINTOOLS0x0030スタートメニューのプログラムの管理ツールXP〜
---CSIDL_CONNECTIONS0x0031Network and Dial-up Connections取得不可
------0x0032参考資料が見つからない取得不可?
------0x0033参考資料が見つからない取得不可?
------0x0034参考資料が見つからない取得不可?
65589CSIDL_COMMON_MUSIC0x0035マイミュージック(All Users)XP〜
65590CSIDL_COMMON_PICTURES0x0036マイピクチャー(All Users)XP〜
65591CSIDL_COMMON_VIDEO0x0037マイビデオ(All Users)XP〜
65592CSIDL_RESOURCES0x0038ResourcesXP〜
---CSIDL_RESOURCES_LOCALIZED0x0039Localized Resource取得不可
---CSIDL_COMMON_OEM_LINKS0x003AOEM specific apps取得不可
65595CSIDL_CDBURN_AREA0x003BCD BurningXP〜
---CSIDL_COMPUTERSNEARME0x003DWorkgroup membership取得不可
上記の表にある備考欄は参考程度のものと考えてください。 結果が異なっていようとも一切の責任は負いません。 取得する必要がある場合は、各自が各環境を準備してテストしましょう。 ウィンドウズ95以前・NT4以前のOSで取得する場合はIE4以上をインストールしてください。
 1
 2
 3
 4
 5
 6
 7
 8
	skip = 1, 3, 4, 10, 12, 15, 17, 18, 29, 30, 42, 44, 49, 50, 51, 52, 57, 58
	sdim buf,3200
	repeat 60
		if check < length(skip) : if cnt = skip.check : check++ : continue
		if buf ! "" : buf += "\n"
		buf += strf("strf(0x%5x)  ",0x10000 + cnt) + dirinfo( 0x10000 + cnt) // 特殊フォルダ一覧
	loop
	mesbox buf, ginfo_winx, ginfo_winy
続いて、カレントフォルダに格納されているフォルダ等を取得する命令を紹介します。
dirlist 受取先変数, ファイルマスク, モード
受取先変数メモリノートパッド形式で取得した結果を格納する文字列型変数を指定する。
ファイルマスクファイル名の一部、拡張子の限定を行う際に指定する。
モード取得するファイルタイプを指定する。
0:全て
1:フォルダ以外
2:隠し属性・システム属性以外
3:隠し属性・システム属性・フォルダ以外
5:フォルダのみ
6:隠し属性・システム属性のみ
7:隠し属性・システム属性・フォルダのみ
DIRectoryLISTの略であるdirlist命令は、指定したファイルマスクでフィルタリングして、 モードで指定したファイルタイプをメモリノートパッド形式で第1パラメータの変数に返します。 全てを取得する場合、ファイルマスクを空にするのではなく、「*」または「*.*」と指定してください。 指定できる取得タイプは上記のモードの通りで、 存在しないモードを指定した場合、モード5のフォルダのみを一覧取得する仕様になっているようです。 存在しないモードを指定してもエラーにはなりませんがわかりにくいだけですので、 ヘルプに記載されたモードのいずれかを指定してください。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
	sdim buf, 1000
	notesel buf
	dirlist buf, "*", 5 // フォルダを取得する
	mes "「" + dir_cur + "」には下記のフォルダが存在します。"
	mes buf
	mes "全てを絶対パスに置き換えると次のようになります。"
	repeat notemax
		noteget foldername, cnt
		mes "「" + dir_cur + "\\" + foldername + "」"
	loop
尚、このdirlist命令はフォルダを含むファイル一覧を取得するだけでなく、 指定したファイル名またはフォルダ名が存在するかのチェックにも使用することができます。 ファイル名の存在チェックは、以前に紹介したexist命令でも可能ですが、フォルダは取得できません。 存在チェックを行うには、dirlist命令のファイルマスクにパスを代入することで、 存在する場合に、第1パラメータの受取先変数にファイルまたはフォルダ名がセットされ、 存在しない場合には、空文字がセットされます。 また、存在する場合はシステム変数statにも真を示すが、存在しない場合は偽を示すがセットされます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
	sdim buf, 512
	fsize = 15
	font msmincho, fsize : objmode 2 : objsize fsize * 5, fsize + 5
	pos 10, 50 : mes "名称"
	pos 90, 50 : mes dir_cur + "\\"
	pos strlen(dir_cur) * (fsize + 1) / 2 + 100, 50 : input buf, 150
	pos 10, 80 : mes "確認"
	pos 90, 80 : button "実行する", *check
	stop

*check
	if buf = "" : stop
	color 255, 255, 255 : boxf , 100 : color
	dirlist getname, buf
	pos 10, 120
	// 存在する場合、statは1、getnameはファイル名
	// 存在しない場合、statは0、getnameは""
	if stat {
		mes dir_cur + "\\" + buf + "は存在します。"
	} else {
		mes dir_cur + "\\" + buf + "は存在しません。"
	}
	pos 10, 150 : mes "ちなみにexistでのチェックは次の通り。"
	exist buf
	if strsize ! -1 {
		mes dir_cur + "\\" + buf + "は存在します。"
	} else {
		mes dir_cur + "\\" + buf + "は存在しません?"
	}
他の使い方としては最近のパソコンでは見る機会自体も減ってしまった 8.3形式(ファイル名3文字+拡張子3文字)のDOSショートネームをロングネームへも変換できます。 続いて、フォルダを新しく作成する命令に移ります。
mkdir フォルダ名
フォルダ名作成するフォルダ名を指定する。
MaKeDIRectoryの略であるmkdir命令は、パラメータの名称でカレントディレクトリにフォルダを作成します。 作成したい名称を指定すれば、命令実行後にフォルダが作られるというだけの簡単な処理なので、 使い方も非常にシンプルですが、1つ気をつけなければならないのは、 既に存在する名称で作成を実行すると、エラー12で、アベンド(異常終了)してしまうということです。 作成の前に存在するかをチェックし、存在する場合は自前のエラートラップで防いでください。 尚、フォルダとして存在しなくても、拡張子のない同名ファイルでもエラーになりますので、 dirlist命令でチェックする場合、モードにファイルも含めるようにしてください。 また、名称として相応しくないファイル禁則文字やピリオドのみ等もエラーとなりますので、 対象文字列に禁則文字を含んでいないかもチェックするようにしてください。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
	sdim folder, 128
	sdim ngcode, 2, 10
	ngcode = "\n", "\t", "\\", "/", ":", "*", "?", "\"", "<", ">", "|"
	pos 10, 10 : mes "「" + dir_cur + "」に新しくフォルダを作成します。名称を決定してください。"
	pos 10, 40 : input folder, 150
	pos 10, 70 : button gosub "作成する", *make
	stop

*make
	// 未入力チェック
	if folder = "" : return
	//ピリオドチェック
	chk = 1
	repeat strlen(folder)
		if strmid(folder, cnt, 1) ! "." {
			chk = 0
			break
		}
	loop
	if chk {
		dialog "フォルダ名にピリオドを含めることはできますが、\nピリオドのみは作成できません。", 1
		return
	}
	// 禁則文字チェック
	foreach ngcode
		chk = instr(folder, , ngcode.cnt)
		if chk ! -1 {
			chk = cnt // ダイアログ表示用に指定した禁則文字を控えておく
			break
		}
	loop
	if chk ! -1 {
		dialog "フォルダ名に「" + ngcode.chk + "」を含めることはできません。", 1
	} else {
		mkdir folder
		dialog "作成しました。"
	}
	return
見ていただいたらわかる通り、利用者に名称を決めてもらって作成するのは面倒なんですね。 エラーイベントを強制トラップして、引っかかったら、エラーメッセージを表示させるという 強引な手もありますが、自分の手でチェックしてしまいましょう。 それでは、この章最後のカレントディレクトリを変更する命令の紹介に移ります。
chdir フォルダパス
フォルダパス変更先のカレントフォルダを指定する。
CHangeDIRectoryの略であるchdir命令を使用すると、
パラメータで指定したフォルダにカレントフォルダを移動させますが、
指定したフォルダが存在しない場合は、mkdir命令の時と同様にエラー12でアベンドします。
利用者に移動先フォルダを入力させる場合は、移動先フォルダが存在するかチェックをかけましょう。
尚、DOSコマンド等の移動コマンドとは違って、異なるドライブ間でも変更することが出来ます。
また「..」で1つ上の階層に移動することも出来ますので覚えておくと役に立つことでしょう。
下記は、フォルダ一覧を表示し、任意のフォルダに移動するサンプルです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
	sdim list, 3200
	notesel list
	objsize 100, 20
	current = dir_cur
	pos 0, 0 : input current, ginfo_winx - 100
	pos ginfo_winx - 100, 0 : button gosub "移動する", *movechk
	objsize 100, ginfo_winy - 20
	pos 0, 20 : button gosub "移動する", *move2
	objsize ginfo_winx - 100, ginfo_winy - 20
	pos 100, 20 : listbox index, , ""
	gosub *move1
	stop

*disp
	// ルートを除く存在するフォルダならば1つ上へ戻る「..」を付加
	dirlist foldername, current
	if foldername ! "" : noteadd "..", 0
	objprm 3, list
	return

*movechk
	// 末端が「¥」だと、「¥」を外す
	if strmid(current, strlen(current) - 1, 1) = "\\" {
		current = strmid(current, 0, strlen(current) - 1)
	}
	dirlist list, current
	if list ! "" : gosub *move1
	return

*move1
	// ルートの場合は「¥」を付ける
	if strlen(current) <= 2 {
		current += "\\"
	}
	chdir current
	dirlist list, "*", 5
	gosub *disp
	return

*move2
	noteget foldername, index
	current += "\\" + foldername
	gosub *move1
	objprm 0, dir_cur
	return