【问题标题】:How to load all files from a directory?如何从目录加载所有文件?
【发布时间】:2010-10-17 03:38:18
【问题描述】:

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

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

【问题讨论】:

  • 加载、运行、定位。特别是使用 lua 对目录中的所有内容使用“dofile(s)”命令

标签: c++ file input lua io


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有关 C++ 解决方案,请查看 Boost.Filesystem 库。

    【讨论】:

      【解决方案3】:

      对于 Lua,您需要模块 Lua Filesystem

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

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

      使用 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 状态,并通过 luaL_dostring() 或使用 C API 从全局表,压入字符串"lfs",然后使用lua_pcall(L,1,1,0) 之类的内容调用Lua 函数,这会将lfs 表留在Lua 堆栈的顶部。

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

      【讨论】:

        【解决方案4】:
        require "lfs"
        
        function loadall(dir)
          for file in lfs.dir(dir) do
            if string.find(file, ".lua$") then
              dofile(dir .. "/".. file)     
            end
          end
        end
        

        【讨论】:

        • 您应该在这里使用dofile 而不是require:您正在加载文件,而不是模块。
        猜你喜欢
        • 2020-07-17
        • 2014-11-08
        • 2023-03-31
        • 1970-01-01
        • 2014-11-18
        • 2012-01-17
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多