我是 lua 新手,试图理解并将各个部分组合在一起并寻求一些帮助。 我已经浏览了有关 lua 文件循环的现有文章,但无法获得所需的输出。
问题 - 我有一个包含文件的文件夹,文件夹路径 - “D:\Test_Files\Outbound\Client\final”
文件夹中的文件扩展名为 - .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
问题:
- 如何从目录中获取文件计数?
- 如何读取目录中是否存在“*.txt”文件?
- 如何使用表列表存储每个文件名并循环读取?
- 如何通过循环读取每个文件并将值传递给函数“Customfunction(f)”?
代码预计可以在 Windows 上运行。请在纯 lua 中分享建议,不要使用外部文件系统函数(例如“lfs”),因为我们不喜欢导入外部函数。
任何建议/帮助将不胜感激!
最佳答案
如果没有 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 答案。您已获得给定名称(在数组中),因此请使用它。
编辑:您可以解析dir
和ls
命令的结果来获取目录列表,但您不应该 。通过这种方式,您不需要安装任何库,您的代码将严重依赖于操作系统。
将库添加到代码中并不是那么糟糕。黑客攻击更糟糕。
(不确定文件扩展名提取功能是否有效。我没有制作本文中使用的目录树代码,它属于 David Kastrup)
关于file - 尝试使用 lua 遍历 Directory 来列出所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49393378/