HSP3 あれこれ <フォルダ>

Last Update : 2007/04/xx

XREA.COMのs206サーバー内のサイトは、Yahoo!検索からペナルティを受け、検索結果で常に下位にランク付けされてしまうので、Yahoo!経由向けに用意したHSPミニ講座内のページです。このページは「http://lhsp.s206.xrea.com/hsp_folder.html」の昔のものです。

フォルダが存在するか調べる

ファイルの存在を確認するのにexist命令というのが用意されていますが、この命令でフォルダ(ディレクトリ)は扱えません。

chdir命令やmkdir命令は、存在しないフォルダが指定されると、エラー12の「ファイルが見つからないか無効な名前です」ダイアログが表示されてプログラムは落ちてしまいます。HSP2では、skiperr命令を使って強制的にエラーを回避させることも可能でしたが、HSP3ではこの命令は一応削除された形になってます。

と言うわけで、もう一つの dirlist命令 を使ったフォルダの有無を確認するサンプルコードです。(→基礎な解説はdirlist命令解説)

	filepath = "C:\\Program Files\\hogehpge"

;	第1パラの変数xはダミー、第3パラにモード5(フォルダのみ)を指定
	dirlist x, filepath, 5

;	stat に 0=存在しない、1=存在する が返る
	if stat = 0 : dialog "そんなフォルダは存在しないよ〜" : stop

;	存在しないフォルダを指定するとエラー
	chdir filepath

また、これは言い換えれば、指定したパスがファイルなのか、フォルダなのかの判定もできます。(ファイルパスであればシステム変数statは常に0、フォルダであれば常に1が返ります)

^

中身のないフォルダの削除

HSPのmkdir命令の逆バージョン、フォルダ(ディレクトリ)の削除です。ここで提示したサンプルはフォルダの中身が「空っぽ」の状態である必要があります。下層フォルダやファイルが存在する場合は、1つ1つ削除(ファイルの場合はdelete命令)していく、Windows APIのSHFileOperation関数を利用する、DOSコマンドを使う、といったところ?

;	中身が空のフォルダ削除サンプル (by Kpan)
;	完全削除となるので注意

#uselib "kernel32"
#func RemoveDirectory "RemoveDirectoryA" str

;	例として、Cドライブ直下のフォルダ
;	(Windows 9x系OSの場合、パス文字列の長さに260バイト制限あり
	RemoveDirectory "C:\\hogehoge"

;	stat に 0=失敗、0以外=成功 が返る
	mes stat

ちなみに、フォルダ名の変更(リネーム)を行いたいなら、HSP3あれこれ ファイル編のページを参照。

^

特殊フォルダのパスを取得

dirinfo関数はWindowsフォルダやシステムフォルダなどが取得できます。HSP2でいうシステム変数windir、curdir、exedir、sysdir、cmdlineに相当するパスです。

さて、HSPのマニュアルには『p1に0x10000以上の値を指定した場合は、ビット0〜15までをCSIDL値として特殊フォルダの取得を行ないます』とあります。その特殊なフォルダ(ディレクトリ)をテキトーに拾ってみ〜るみる。

HSP拡張プラグイン「hspext.dll」がサポートするfxdir命令と同等の結果を得られます。Windows 9x系の場合、最後あたりの項目は取得できないかもしれません。内部的にはWin32 APIのSHGetSpecialFolderLocation関数を呼んでおり、ちょくとさんのページにそのCSIDL値リストが掲載されてるので参照してみてください。

;	特殊フォルダのパス表示スクリプト (by Kpan)
;	「<>」ぐくりはマクロ名(hspdef.as)、「*」は共有の「All User」

	font "", 12

	mes "デスクトップ <dir_desktop>: "+dirinfo($10000)
	mes "スタートメニュー 「プログラム」フォルダ: "+dirinfo($10002)
	mes "「マイドキュメント」フォルダ <dir_mydoc>: "+dirinfo($10005)
	mes "「お気に入り」フォルダ: "+dirinfo($10006)
	mes "「スタートアップ」フォルダ: "+dirinfo($10007)+"\n

	mes "「最近使ったファイル」フォルダ: "+dirinfo($10008)
	mes "「送る」(SendTo)フォルダ: "+dirinfo($10009)
	mes "スタートメニュー フォルダ: "+dirinfo($1000B)
	mes "「マイ ミュージック」フォルダ: "+dirinfo($1000D)
	mes "「マイ ビデオ」フォルダ: "+dirinfo($1000E)+"\n

	mes "「Fonts」フォルダ: "+dirinfo($10014)
	mes "「Template」フォルダ: "+dirinfo($10015)
	mes "*スタートメニュー フォルダ: "+dirinfo($10016)
	mes "*スタートメニュー 「プログラム」フォルダ: "+dirinfo($10017)
	mes "*「スタートアップ」フォルダ: "+dirinfo($10018)+"\n

	mes "*デスクトップ: "+dirinfo($10019)
	mes "「Application Data」フォルダ: "+dirinfo($1001A)
	mes "「Local Settings\Application Data」フォルダ: "+dirinfo($1001C)
	mes "*「お気に入り」フォルダ: "+dirinfo($1001F)
	mes "「Local Settings\\Temporary Internet Files」フォルダ: "+dirinfo($10020)+"\n

	mes "Internet 「Cookies」フォルダ: "+dirinfo($10021)
	mes "Internet 「履歴」フォルダ: "+dirinfo($10022)
	mes "*「Application Data」フォルダ: "+dirinfo($10023)
	mes "「Program Files」フォルダ "+dirinfo($10026)
	mes "「マイ ピクチャー」フォルダ: "+dirinfo($10027)+"\n

	mes "「Ducuments and Settings\\(ユーザー名)」フォルダ: "+dirinfo($10028)

最後に、テンポラリフォルダ(一時ファイル用のTempフォルダ)のパス取得です。拡張プラグインで提供されるfxdir命令では取得できますが、dirinfo関数では唯一取得不可なパスです。Win32 APIのGetTempPath関数を利用します。パスの区切り「\」記号が最後尾に付きます。

;	テンポラリフォルダのパス文字列取得 (by Kpan)

	sdim lpBuffer, 512
	GetTempPath 512, varptr(lpBuffer) 

	mes lpBuffer

/*
;	(おまけ) ロングパス変換
	sdim lpszLongPath, 512
	GetLongPathName lpBuffer, varptr(lpszLongPath), 512

	mes lpszLongPath

^

Copyright © Kpan. All rights reserved.