Last Update : 2008/11/xx
フォルダ(ディレクトリ)関連のサンプルスクリプトです。フォルダに関連した標準命令には、下のようなものがあります。
名称 | 説明 |
mkdir命令 | フォルダの新規作成 |
dirlist命令 | 特定フォルダのファイル・フォルダ一覧リストを取得 フォルダの存在有無の確認 指定パスがファイルかフォルダか識別判定 |
chdir命令 | カレントフォルダの移動変更 |
dirinfo関数 | 各種フォルダパスの取得 (自分自身、システム・Windows・ディスクトップフォルダ...) |
ファイルの存在を確認するのに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が返ります。
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
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 */
Copyright © 2005-2012 Kpan. All rights reserved.