HSPエラー12「ファイルが見つからないか無効な名前です」

無料なWindowsプログラミングツールHSPのエラーメッセージ「HSP Error」(HSPエラー)。
 原因は呼んで字のごとくファイルが見つからないために表示されます。HSPエラーの番号は「12」。エディタ上のコンパイル実行では『ファイルが見つからないか無効な名前です』のメッセージ。実行ファイルでのエラーメッセージは『内部エラーが発生しました(12)』。

このエラーが起こりうるファイル関連の入力系標準命令は以下のとおりです。

ファイル関連の出力系標準命令は以下のとおりです。

 また、これ以外にフォルダ(ディレクトリ)関連でも表示されます。

関連して、picload命令で画像ファイルが見つからない場合はHSPエラー13。 エラー12とこのエラー13は原因は同じ場合が多いと思います。また、拡張プラグイン(DLLファイル)が見つから ない場合はHSPエラー38です。

ファイル関連

ファイル関連は、そのままファイルが存在しないのが原因です。
 ファイルの存在を確認するexist命令を必ず用意するようにしましょう。システム変数strsizeに-1が返ると、 ファイルが存在してないことになります。自分の環境では当たり前のように存在してるファイルであっても、他人の 環境ではあるべき所にない、なんてなことがいくらでも想定できます。

ファイルはちゃんと存在してるのであれば、パス指定のミスでしょう。拡張子もちゃんと指定しましょう。

HSP付属マニュアル『プログラミングマニュアル1・基本仕様ガイド (hspprog.htm)』の「2.スクリプト記述の 基本→文字列」にあるように、「\」(円マーク)は特殊記号ということで、 パスの区切りを「\\」と書く必要があります。ちなみに、「/」(スラッシュ)も区切りとして認識します(機能上の違いはなし)。

;	×
	notesel buf
	noteload "docs\HSPLicense.txt"

	mes buf
;	○
	notesel buf
	noteload "docs\\HSPLicense.txt"

	mes buf
;	○
	notesel buf
	noteload "docs/HSPLicense.txt"

	mes buf

上のような相対パスの場合、 仮にカレントフォルダが移動してると読み込めません。実行ファイルの直下にあるフォルダ内のファイルを確実に 読み込むには、dirinfo関数(タイプ1)or システム変数「dir_exe」と組み合わて絶対パスを指定します。

	notesel buf
	noteload dirinfo(1) + "\\docs\\HSPLicense.txt"

	mes buf

出力系命令の場合だと、指定したパスに含まれるフォルダが存在しない場合にエラーが表示されます。 下のコードは「hoge」というフォルダが存在してることが前提になってます。

	bmpsave "hoge\\sample.bmp"

他にも、ファイルが読み取り専用属性になってる、ファイルへのアクセス権がない、などファイルを書き 換えできない個別PC上での制限も。

◆ PACKFILE機能の制限

実行ファイルに任意のファイルをパックできるPACKFILE機能を利用してる 場合、ファイル名に制限があります。HSPリファレンスから引用すると、『ここで指定するファイル名は スペースを含まない半角で11文字以内のMS-DOSファイルネームでなければなりません。』とあります。正確に 言うと、拡張子も含めて15バイト以下である必要があります。

通常の外部ファイルの読み込みの場合は、ファイル名に制限がないのでスクリプトエディタ上での コンパイル実行では問題は起こりません。長いファイル名の場合、実行ファイルの作成 段階では問題は起こりませんが、いざ実行ファイル単体で起動した時点でエラー12になります。

//	× アウト!
#epack "abcdefghijkl.txt"

	notesel buf
	noteload "abcdefghijkl.txt"

	mes buf
//	○ セーフ!
#epack "abcdefghijk.txt"

	notesel buf
	noteload "abcdefghijk.txt"

	mes buf

なお、リファレンスには、『ファイル名は、拡張子も含めて19文字までが識別対象になります。 (ロング ファイル名でも認識します。) 』という記述もありますが、これは間違いの可能性あり???

PACKFILE機能として実行ファイルに埋め込むファイル名が日本語だと、実行ファイル作成の段階で「#ファイルがありません。」という エラーで実行ファイルを作成できません。

フォルダ関連

フォルダ(ディレクトリ)が存在しません。たとえば、下層の「sample」フォルダに「hogehoge」という新規のフォルダを作成すると 下のようになります。これは「sample」フォルダが存在してることが前提となっており、存在しなければエラーです。

	mkdir "sample\\hogehoge"

ちなみに、「sample\hogehoge」のフォルダがすでに存在してる場合もエラーになります。つまりは、上のコードの 1回目のコンパイル実行でフォルダが問題なく作成され、そのまま2回目のコンパイル実行ではすでにフォルダが存在している ため新規にフォルダを作成できなかった結果、エラーとなるワケです。("フォルダの上書き"はない)

ファイルの存在を確認するexist命令と同じ感じで、フォルダが存在するかを確認するためdirlist命令を 利用します。第1パラメータは何でもいいのでダミーの変数、マスクに確認するフォルダ名orフォルダのパス、第2 パラメータに数値の「5」を指定します。

	dirlist xxx, "sample", 5
//	dirlist xxx, dirinfo(1) + "\\sample", 5
	mes stat

これにより、システム変数statに0(フォルダが存在しない)か1(フォルダが存在する)が返ります。

(おまけ) 特殊なキャラクタ文字

mes命令・print命令で文字を表示したい場合は、HSPスクリプトの表現上普通の書き方では表示できない記号が あります。円記号(\)、ダブルクォーテーション(")です。これは円記号(\)を付け 足して表現します。

	mes "\\1,980"

	mes "\"もしもし〜\""

また、改行とTABスペース(タブスペース)は円記号(\)を付けて表現することも可能です。

	mes "文字を改\n行する"

	mes {"文字を改
	行する"}

	mes "\tタブスペース"

	mes "	タブスペース"

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク