如何从目录加载所有文件?

时间:2009-04-02 15:35:21

标签: c++ file input lua io

就像标题所说;如何加载目录中的每个文件?我对c ++和lua感兴趣。

编辑: 对于Windows我会很高兴一些真正的工作代码,特别是对于lua。我可以使用boost :: filesystem for c ++。

4 个答案:

答案 0 :(得分:8)

对于Lua,您需要模块Lua Filesystem

正如Nick所观察到的,访问文件系统本身(而不是单个文件)超出了C和C ++标准的范围。由于Lua本身(用于实现C模块的require()的动态加载器除外)用标准C编写,因此核心语言缺少许多文件系统功能。

但是,扩展Lua核心很容易,因为(几乎)任何具有文件系统的平台也支持DLL或共享库。 Lua文件系统是一个可移植的库,它增加了对目录迭代,文件属性发现等的支持。

使用lfs,在Lua中模拟DIR的一些功能基本上就像:

require "lfs"
dot = arg[1] or "."
for name in lfs.dir(dot) do
    local fqn = dot.."/"..name
    local attr = lfs.attributes(fqn)
    print(name, attr.mode, os.date("%Y-%m-%d %H:%M",attr.modification), attr.size)
end

产生的输出如下:

E:...>t-lfs.lua
.       directory       2009-04-02 13:23        0
..      directory       2009-04-02 13:18        0
foo.txt file    2009-02-23 01:56        0
t-lfs.lua       file    2009-04-02 13:18        241

E:...>

如果你的Lua副本来自Lua for Windows,那么你已经安装了lfs,上面的示例将开箱即用。

编辑:顺便提一下,Lua解决方案也可能是一个合理的C或C ++解决方案。 Lua核心并不大,提供动态的垃圾收集语言,并且很容易与C作为托管应用程序或扩展模块进行交互。要使用来自C应用程序的lfs,您将链接Lua DLL,初始化Lua状态,并通过require"lfs"或使用C API检索{来获取状态以执行luaL_dostring() {1}}来自全局表的函数,推送字符串require(),并使用"lfs"之类的函数调用Lua函数,这样lua_pcall(L,1,1,0)表就位于Lua堆栈的顶部。

如果您已经需要嵌入式脚本语言,并且Lua符合您的要求,这种方法可能最有意义。

答案 1 :(得分:4)

对于C ++解决方案,请查看Boost.Filesystem库。

答案 2 :(得分:2)

目录中的列表文件由平台定义,因此您必须使用平台相关库。对于c ++和Lua(仅实现ansi c功能)也是如此。

答案 3 :(得分:1)

require "lfs"

function loadall(dir)
  for file in lfs.dir(dir) do
    if string.find(file, ".lua$") then
      dofile(dir .. "/".. file)     
    end
  end
end