使用 Lua 扫描文件夹。

我正在尝试获取保存在两个文件夹中的所有文件的名称,名称保存为:

1.lua  2.lua  3.lua 4.lua 等等

文件夹名称为:

第一个文件夹: "/const /"
第二个文件夹: "/virt/"

我试图做的是仅获取文件的编号,这样做可以工作,但顺序不对。例如,当我获取第 17 个文件时,我先得到的是函数传递的第 17 个,而不是第 15 个,这会导致问题。下面是我正在使用的函数代码:

local virt_path = "/virt/"
local const_path = "/const"
local fs = require "lfs"

local const = {}

for num = 1, (numberoffile)do   -- numberoffile 是预定义的,无法更改
    const[num] = assert(
        dofile (const_path .. mkfilename(num)),
        "Failed to load constant  ".. num ..".")
end

local function file_number()  --这是让我感到头疼的函数
    local ci, co, num = ipairs(const)
    local vi, vo, _   = fs.dir(virt_path)
    local function vix(o)
        local file = vi(o)
        if file == nil then return nil end
        local number = file:match("^(%d+).lua$")
        if number == nil then return vix(o) end
        return tonumber(number)
    end
    local function iter(o, num)
        return ci(o.co, num) or vix(o.vo, num)
    end
    return iter, {co=co, vo=vo}, num
end

正如我所说,该函数提供所需的返回值,但不是正确的算术顺序。

有什么想法我在这里做错了吗?

点赞
用户2328287
用户2328287

我使用了我的 path[1] 库。

  1. 我们使用文件名填充表格。

    local t = {}
    for f in path.each("./*.lua", "n") do
      t[#t + 1] = tonumber((path.splitext(f)))
    }
    
    table.sort(t)
    
    for _, i in ipairs(t) do
      -- 做工作
    end
    
  2. 我们检查文件是否存在。

    for i = 1, math.huge do
      local p = "./" .. i .. ".lua"
      if not path.exists(p) then break end
      -- 做工作
    end
    

[1] https://github.com/moteus/lua-path

2014-12-15 11:37:10