NScripter(に限らない)で今現在のディレクトリのリストを取得する。

こういうのを聞いて、もうなりふり構ってらんねえな、と思いつつ作ってみた。

Luaパート

-- system.lua
do
	local dir = {} -- 取得したディレクトリの中身を入れておくテーブル
	function dir_list()
		dir = {} -- 初期化
		os.remove("dir.txt") -- 結果ファイルを初期化。
		NSExec("shell \"dir.vbs\"") -- dir.txtに書きこませる。
		
		local fh = nil -- ファイルハンドル
		while true do
			NSSleep(10) -- 念のため、10ミリ秒待ってみる。
			fh = io.open("dir.txt", "r") -- ファイルを開いてみる。
			if io.type(fh)=="file" then break end -- 開くのに成功すればループから抜ける。
		end
		
		for line in fh:lines() do -- 一行ずつ読み込んで登録していく。
			dir[1+#dir] = line -- chompされてるから安心だ。
		end
		fh:close() -- ファイルハンドルを閉じる。
	end

	function dir_list_verify() -- 読み込んでなければ読み込む。
		if #dir == 0 then dir_list() end
	end
	
	NSExec("luasub read_dir")
	function NSCOM_read_dir() -- 強制更新用命令
		dir_list()
	end
	
	-- いくつファイルがあるかを返す。
	function filenum_in_dir()
		dir_list_verify() -- 確認。
		return #dir -- 数を返す。
	end
	NSExec("luasub filenum_in_dir")
	function NSCOM_filenum_in_dir() -- このディレクトリに今いくつのファイルがあるかを返す。
		NSSetIntValue(NSPopIntRef(), filenum_in_dir())
	end
	
	-- ファイル名を番号を指定して返す。
	function read_file_name(num)
		dir_list_verify() -- 確認。
		if type(num)~="number" then return nil end -- 数値以外は受け付けない。
		if num<1 then return nil end -- 数値が0なら
		if num>#dir then return nil end
		return dir[num]
	end
	NSExec("luasub read_file_name")
	function NSCOM_read_file_name()
		local ref = NSPopStrRef()
		NSSetStrValue(ref, "")
		NSPopComma()
		local res = read_file_name(NSPopInt()+1)
		if res then NSSetStrValue(ref, res) end
	end
	
end

system.lua内か、そこから呼び出すファイルに記述する。

dir.vbs

この名前でファイルを作り、その中に以下を記述する。

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c dir.bat",vbhide

dir.bat

この名前でファイルを作り、その中に以下を記述する。

dir /B > dir.txt

解説

3つの命令を追加する。

filenum_in_dir
引数に一つの数値変数を指定する。その変数に、現在ディレクトリ内にあるファイルの数がはいる。
read_file_name
第一引数に文字列変数、第二引数に数値を指定する。名前順で並べた後で、第二引数の数値番号のファイル名を文字列変数に入れて返す。なお、ファイル番号は0オリジンなので、0からfilenum_in_dirで得た数値-1までが有効範囲になる。
read_dir
現在のディレクトリの中身を更新する。内部的にキャッシュを使っているので、キャッシュと実態が一致しなくなったら、これを実行するべし。

サンプル

00.txt

*define

deletemenu

game

*start
	filenum_in_dir %0
	%0
	for %1=0 to %0-1
		read_file_name $1,%1
		len %10,$1
		if %10 mod 2 == 1 add $1," "
		puttext $1
	next
	@
end
実行例