rikky_module.dir
code:Lua
rikky_module.dir(folder, ext)
table:引数
名前 型 説明
string string 検索するフォルダのフルパス
ext string 検索する拡張子 ( . は不要) または"","*all"
戻り値 {string...} 検索結果が格納された配列
第2引数に""を入れると、フォルダを検索する
第2引数に"*all"を入れると、全てのファイルパスを取得する
Tips
code:Lua
local bit=require"bit"
local ffi=require"ffi"
ffi.cdef[[
typedef const char* LPCSTR;
typedef void* HANDLE;
typedef uint32_t DWORD;
typedef uint16_t WORD;
typedef int8_t CHAR;
typedef int32_t BOOL;
typedef struct {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
typedef struct {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
CHAR cAlternateFileName14; DWORD dwFileType;
DWORD dwCreatorType;
WORD wFinderFlags;
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
BOOL FindClose(HANDLE hFindFile);
]]
function dir(dir,ext)
local ret={}
local wfd=ffi.new("WIN32_FIND_DATAA")
local wfdp=ffi.cast("LPWIN32_FIND_DATAA",wfd)
local hFind
local flagdir=false
if(ext=="")then
hFind=ffi.C.FindFirstFileA(dir.."\\*",wfdp)
flagdir=true
elseif(ext=="*all")then
hFind=ffi.C.FindFirstFileA(dir.."\\*",wfdp)
else
hFind=ffi.C.FindFirstFileA(dir.."\\*."..ext,wfdp)
end
if(ffi.cast("uint32_t",hFind)==0xffffffff)then
return nil
end
repeat
local isdir=bit.band(wfdp.dwFileAttributes,0x10)~=0
if(isdir and flagdir or not(isdir or flagdir))then
ret#ret+1=ffi.string(wfd.cFileName) end
until ffi.C.FindNextFileA(hFind,wfdp)==0
ffi.C.FindClose(hFind)
return ret
end