fileexist回り
fileexist命令は、あるファイルが存在するかどうかを調べて返す命令。
第一引数に結果を受け取る数値変数、第二引数に調べたいファイル名を記述する。
この命令の実際の動きは、
- 実際にそのファイルがあるか。あれば1を返して終了。
- デフォルトのnsaの中にそのファイルがあるか。あれば1を返して終了。
- addnsadirなどで追加したnsaの中にそのファイルがあるか。あれば1を返して終了。
- ないと判断して0を返して終了。
このように記述できるだろう。
恐らく内部的には、nslua.dll の NSGetFileInfo と低レベル処理を共有しているのではないかと思われる。
それはともかく、高機能で便利な命令ではあるが、弱点がない訳でもなく、ファイル名に2byte文字が含まれているとコケると言う重大な特徴が含まれている。
ここでは、これの対処法を考えてみる。
2byte文字を使わない。
……いや、そやねんけど、そういうことやないねん。
ファイル名に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を実行するようにするか、まあ、そういうことですわな。