fileexist回り

fileexist命令は、あるファイルが存在するかどうかを調べて返す命令。
第一引数に結果を受け取る数値変数、第二引数に調べたいファイル名を記述する。
この命令の実際の動きは、

  1. 実際にそのファイルがあるか。あれば1を返して終了。
  2. デフォルトのnsaの中にそのファイルがあるか。あれば1を返して終了。
  3. addnsadirなどで追加したnsaの中にそのファイルがあるか。あれば1を返して終了。
  4. ないと判断して0を返して終了。

このように記述できるだろう。
恐らく内部的には、nslua.dll の NSGetFileInfo と低レベル処理を共有しているのではないかと思われる。
それはともかく、高機能で便利な命令ではあるが、弱点がない訳でもなく、ファイル名に2byte文字が含まれているとコケると言う重大な特徴が含まれている。
ここでは、これの対処法を考えてみる。

2byte文字を使わない。

……いや、そやねんけど、そういうことやないねん。

2byte文字があったら、URIエスケープする

確かに一度そういうことやったことあるけど、これもやっぱりそういうことやないねんて。きっと。多分。

ファイル名に2byte文字が含まれているかどうかをチェックする。

そうや、それでええねん。

function contain_zenkaku(str) -- 文字コードはShift-JISに固定。NScripterだからね!
	if type(str) ~= "string" then return false end -- 文字列型しか受け付けない。
	if str:len() == 0 then return false end -- 空文字列の処理。
	local res = false
	local letter
	for i = 1, str:len() do
		letter = str:byte(i)
		res = 223 < letter; if res then break end
		res = ( 126 < letter and 161 > letter ) ; if res then break end
	end
	return res
end

fileexistを実行する前にファイルをチェックするか、fileexistをdefsubないしluasubで上書きして、まずcontain_zenkakuを実行するようにするか、まあ、そういうことですわな。