Dir Tree Iterator

lua-users home
wiki

Showing revision 6
The following implementation provides a Lua iterator function that recursively iterates over the files and subdirectories in a given directory.

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

RecentChanges · preferences
edit · history · current revision
Edited August 29, 2007 6:32 pm GMT (diff)