2

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

编辑:对于windows,我会很高兴有一些真正的工作代码,尤其是lua。我可以用 c++ 的 boost::filesystem 来做。

4

4 回答 4

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"通过luaL_dostring()或使用 C APIrequire()从全局表中检索函数、推送字符串"lfs"和获取状态以执行用类似的东西调用 Lua 函数lua_pcall(L,1,1,0),这会将lfs表留在 Lua 堆栈的顶部。

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

于 2009-04-02T20:27:38.277 回答
4

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

于 2009-04-02T15:43:14.357 回答
2

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

于 2009-04-02T15:40:57.983 回答
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
于 2012-03-07T12:24:24.493 回答