尝试遍历Directory以使用lua列出所有文件

时间:2018-03-20 20:15:38

标签: file lua path

我是lua的新手,试图了解并将各个部分放在一起并寻求一些帮助。     我已经阅读了有关lua文件循环的现有文章,但无法获得所需的输出。

问题 - 我有一个文件夹,文件夹路径 - .txt 扩展名为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) -- Passing file content to customfunction to apply business logic. end

的文件夹中的文件

尝试:

  1. 获取文件夹中的文件数(在本例中为“final”文件夹)。
  2. 读取每个文件,构建类似于此的循环:

    Clicked
  3. 问题:

    1. 如何从目录中获取文件数?
    2. 如何阅读目录以检查“* .txt”文件是否存在?
    3. 如何使用表格列表存储每个文件名并通读循环?
    4. 如何通过循环读取每个文件并将值传递给函数“Customfunction(f)”?
    5. 代码应该在Windows上运行。请不要使用外部文件系统函数(例如'lfs')来分享纯lua中的建议,因为我们不想导入外部函数。

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

1 个答案:

答案 0 :(得分:0)

你不能(至少不应该)在没有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命令的结果以获取目录列表,但您不能。通过这种方式,您不需要安装任何库,您的代码将严重依赖操作系统

在代码中添加库并不是那么糟糕。黑客行为更糟糕。

(不确定文件扩展名提取功能是否正常。我没有在这篇文章中使用过脏代码,它属于David Kastrup)