HSP3 あれこれ <フォルダ>

Last Update : 2008/11/xx

◆ フォルダ

 フォルダ(ディレクトリ)関連のサンプルスクリプトです。フォルダに関連した標準命令には、下のようなものがあります。

名称 説明
mkdir命令 フォルダの新規作成
dirlist命令 特定フォルダのファイル・フォルダ一覧リストを取得
フォルダの存在有無の確認
指定パスがファイルかフォルダか識別判定
chdir命令 カレントフォルダの移動変更
dirinfo関数 各種フォルダパスの取得
(自分自身、システム・Windows・ディスクトップフォルダ...)

↑TOP↑

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

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

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

 と言うわけで、もう一つの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が返ります。

↑TOP↑

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

 HSPのmkdir命令の逆バージョン、フォルダ(ディレクトリ)の削除です。RemoveDirectory関数を利用します。

 なお、ここで提示したサンプルはフォルダの中身が必ず「空っぽ」の状態である必要があります。下層フォルダやファイルが存在する場合は、1つ1つ削除(ファイルの場合はdelete命令)していくか、Windows APIのSHFileOperation関数(ぷまさんのページ参照)を利用することになります。ちなみに、フォルダ名の変更(リネーム)を行いたいなら、HSP3あれこれ ファイル編のページを参照。

//	中身が空のフォルダ削除サンプル (by Kpan)
//	ごみ箱を経由せず完全削除となるので注意

#include "kernel32.as"

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

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

↑TOP↑

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

 dirinfo関数はWindowsフォルダやシステムフォルダなどが取得できます。HSP2でいうシステム変数windir、curdir、exedir、sysdir、cmdlineに相当するパスです。HSPのマニュアルにはdirinfo関数の説明に下のような情報があります。その特殊なフォルダ(ディレクトリ)のパス文字列をテキトーに拾ってみるみる。

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関数を利用します。(結果はショートパス形式で返るので、ロングパス形式に変換したい場合はGetLongPathName関数を)

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

#include "kernel32.as"

	sdim lpBuffer, 256
	GetTempPath 256, varptr(lpBuffer)

	mes lpBuffer

/*
;	ロングパス変換
	sdim lpszLongPath, 256
	GetLongPathName lpBuffer, varptr(lpszLongPath), 256

	mes lpszLongPath
*/

↑TOP↑

〜HSP3 あれこれ〜
ウィンドウ | オブジェクト | ファイル | フォルダ | キーボード | マウス | メニュー | システム | 文字列 | COM | その他

Copyright © 2005-2012 . All rights reserved.