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.