尝试使用Lua循环遍历目录以列出所有文件

我是Lua的新手,尝试理解和整合代码,希望得到一些帮助。 我查看了关于Lua文件循环的现有文章,但无法获得所需的输出结果。

问题 - 我有一个带有文件的文件夹,文件夹路径 - "D:\Test_Files\Outbound\Client\final"。 文件夹中的文件扩展名为 - .txt

尝试:

  1. 获取此文件夹中的文件数(在本例中为"final"文件夹)。

  2. 读取每个文件,构建类似于此的循环:

    list = {}
    for i=0,(#Totalfilecount) do
    local fr = io.open('D:\Test_Files\Outbound\Client\final\'..filename.,'rb')
    local f = fr.read('*.txt')
    
    Customfunction(f) -- 将文件内容传递给Customfunction以应用业务逻辑。
    end
    

问题:

  1. 如何从目录中获取文件计数?
  2. 如何读取目录以检查是否存在带有"*.txt"的文件?
  3. 如何使用表列表存储每个文件名并通过循环读取?
  4. 如何通过循环读取每个文件并将值传递给函数 "Customfunction(f)"?

代码预计在Windows上运行。请在不使用外部文件系统函数(例如“lfs”)的情况下以纯Lua分享建议,因为我们不想导入外部函数。

任何建议/帮助都将不胜感激!

点赞
用户6889435
用户6889435

你不能(至少不应该)在不扩展 Lua 的情况下做到这一点。为了实现这一点,你必须下载 LuaFileSystem 库。你可以使用 LuaRocks 来完成:

$ luarocks install luafilesystem

使用库的方式如下:

require "lfs"

function dirtree(dir)
    assert(dir and dir ~= "", "Please pass directory parameter")
    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

上面的代码可用于如下的示例:

for filename, attr in dirtree("D:\Test_Files\Outbound\Client\final") do
    print(attr.mode, filename)
end

你需要检查文件扩展名是否等于 txt。使用下面的代码片段可以读取文件扩展名:

function GetFileExtension(path)
    return path:match("^.+(%..+)$")
end

因此,回答你的问题,你只需要计算在 dirtree 函数返回的数组中的元素数量,即可知道目录中有多少个文件。回答第二个问题,只需要使用帖子中的代码即可。你想要的表格由 dirtree() 返回,但你可能只想从其中提取 .txt 文件。阅读文件,只需要查看其他 SO 回答。你已经得到所需的名称(在数组中),所以使用它。

编辑:你可以解析 dirls 命令的结果来获取目录列表,但不应该这样做。虽然这样不需要安装任何库,但是你的代码将会在不同的操作系统上表现不同。

向你的代码添加库并不是什么坏事。hack 事情更糟糕。

(不确定提取文件扩展名的函数是否有效。我没有制作本帖中使用的 dirtree 代码,它属于 David Kastrup)

2018-03-21 12:05:21