Dir Tree Iterator |
|
It depends on the LuaFileSystem library ("lfs") [1].
-- code by AlexanderMarinov -- Compatible with Lua 5.1 (not 5.0). require "lfs" function dirtree(dir) assert(dir and dir ~= "", "directory parameter is missing or empty") if string.sub(dir, -1) == "/" then dir=string.sub(dir, 1, -2) end local diriters = {lfs.dir(dir)} local dirs = {dir} return function() repeat local entry = diriters[#diriters]() if entry then if entry ~= "." and entry ~= ".." then local filename = table.concat(dirs, "/").."/"..entry local attr = lfs.attributes(filename) if attr.mode == "directory" then table.insert(dirs, entry) table.insert(diriters, lfs.dir(filename)) end return filename, attr end else table.remove(dirs) table.remove(diriters) end until #diriters==0 end end
A more concise version using coroutines would be
-- Code by David Kastrup require "lfs" function dirtree(dir) assert(dir and dir ~= "", "directory parameter is missing or empty") if string.sub(dir, -1) == "/" then dir=string.sub(dir, 1, -2) end local function yieldtree(dir) for entry in lfs.dir(dir) do if entry ~= "." and entry ~= ".." then entry=dir.."/"..entry local attr=lfs.attributes(entry) coroutine.yield(entry,attr) if attr.mode == "directory" then yieldtree(entry) end end end end return coroutine.wrap(function() yieldtree(dir) end) end
Example usage when the current directory (.) is the Lua source directory:
> -- example
> for filename, attr in dirtree(".") do
>> print(attr.mode, filename)
>> end
file ./COPYRIGHT
directory ./doc
file ./doc/contents.html
file ./doc/logo.gif
file ./doc/lua.1
file ./doc/lua.css
file ./doc/lua.html
file ./doc/luac.1
file ./doc/luac.html
file ./doc/manual.html
file ./doc/readme.html
directory ./etc
file ./etc/all.c
file ./etc/lua.hpp
file ./etc/lua.ico
file ./etc/lua.pc
file ./etc/luavs.bat
file ./etc/Makefile
file ./etc/min.c
file ./etc/noparser.c
file ./etc/README
file ./etc/strict.lua
file ./HISTORY
file ./INSTALL
file ./Makefile
file ./README
directory ./src
file ./src/lapi.c
file ./src/lapi.h
file ./src/lauxlib.c
file ./src/lauxlib.h
file ./src/lbaselib.c
file ./src/lcode.c
file ./src/lcode.h
file ./src/ldblib.c
file ./src/ldebug.c
file ./src/ldebug.h
file ./src/ldo.c
file ./src/ldo.h
file ./src/ldump.c
file ./src/lfunc.c
file ./src/lfunc.h
file ./src/lgc.c
file ./src/lgc.h
file ./src/linit.c
file ./src/liolib.c
file ./src/llex.c
file ./src/llex.h
file ./src/llimits.h
file ./src/lmathlib.c
file ./src/lmem.c
file ./src/lmem.h
file ./src/loadlib.c
file ./src/lobject.c
file ./src/lobject.h
file ./src/lopcodes.c
file ./src/lopcodes.h
file ./src/loslib.c
file ./src/lparser.c
file ./src/lparser.h
file ./src/lstate.c
file ./src/lstate.h
file ./src/lstring.c
file ./src/lstring.h
file ./src/lstrlib.c
file ./src/ltable.c
file ./src/ltable.h
file ./src/ltablib.c
file ./src/ltm.c
file ./src/ltm.h
file ./src/lua.c
file ./src/lua.h
file ./src/luac.c
file ./src/luaconf.h
file ./src/lualib.h
file ./src/lundump.c
file ./src/lundump.h
file ./src/lvm.c
file ./src/lvm.h
file ./src/lzio.c
file ./src/lzio.h
file ./src/Makefile
file ./src/print.c
directory ./test
file ./test/bisect.lua
file ./test/cf.lua
file ./test/echo.lua
file ./test/env.lua
file ./test/factorial.lua
file ./test/fib.lua
file ./test/fibfor.lua
file ./test/globals.lua
file ./test/hello.lua
file ./test/life.lua
file ./test/luac.lua
file ./test/printf.lua
file ./test/README
file ./test/readonly.lua
file ./test/sieve.lua
file ./test/sort.lua
file ./test/table.lua
file ./test/trace-calls.lua
file ./test/trace-globals.lua
file ./test/xd.lua