You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Lua遍历指定目录获取TXT文件数量并读取文件求助

Lua文件遍历与读取解决方案

Hey there! Let's work through your Lua file handling task together—since you're new to the language, I'll break this down clearly for you.

1. 获取指定文件夹内的.txt文件总数并遍历读取

Lua的标准库没有直接提供目录遍历的函数,但在Windows环境下,我们可以借助系统命令来获取文件列表,再完成后续的读取操作。这里是针对你指定路径D:\Test_Files\Outbound\Client\final的完整实现:

local targetDir = [[D:\Test_Files\Outbound\Client\final]]
local fileList = {}

-- 借助Windows的dir命令筛选出所有.txt文件
local cmd = string.format('dir /b /a-d "%s\\*.txt"', targetDir)
local handle = io.popen(cmd)

-- 读取命令输出,把文件名存入列表
for fileName in handle:lines() do
    table.insert(fileList, fileName)
end
handle:close()

-- 获取文件总数
local totalFiles = #fileList
print("Total .txt files in folder:", totalFiles)

-- 遍历每个文件并读取内容,构建你需要的list结构
local list = {}
-- 如果你习惯从0开始索引,把循环起始值改成0即可
for i = 1, totalFiles do
    local fullPath = string.format("%s\\%s", targetDir, fileList[i])
    local file = io.open(fullPath, "r")
    
    if file then
        -- 读取整个文件内容,也可以按行读取(用file:lines())
        local content = file:read("*a")
        table.insert(list, {
            index = i,
            filename = fileList[i],
            content = content
        })
        file:close()
    else
        print("Oops, failed to open file:", fullPath)
    end
end

-- 可选:测试输出list的内容(只显示前100字符预览)
for _, item in ipairs(list) do
    print("\n--- File:", item.filename, "---")
    print("Content preview:", string.sub(item.content, 1, 100))
end

关键细节解释

  • 路径处理:用双括号[[ ]]包裹Windows路径,能避免\转义的麻烦,写起来更省心。
  • dir命令参数/b让命令只输出纯文件名,/a-d表示只保留文件、排除文件夹,精准筛选我们要的.txt文件。
  • 文件读取io.open打开文件后,记得用file:close()关闭句柄,避免资源泄漏;read("*a")会一次性读取整个文件内容,如果需要逐行处理,换成for line in file:lines() do ... end即可。
  • 循环索引:Lua的表默认从1开始索引,如果你一定要用i=0开头的循环,只需要把循环起始值改成0,同时调整list的插入逻辑就行。

可选:跨平台方案(用第三方库)

如果你的Lua环境支持第三方库,推荐用LuaFileSystem(lfs),它是跨平台的目录处理工具,更优雅:

local lfs = require "lfs"
local targetDir = [[D:\Test_Files\Outbound\Client\final]]
local fileList = {}

for entry in lfs.dir(targetDir) do
    local attr = lfs.attributes(targetDir.."\\"..entry)
    -- 筛选文件且后缀为.txt
    if attr and attr.mode == "file" and string.match(entry, "%.txt$") then
        table.insert(fileList, entry)
    end
end

-- 后续的文件总数统计、内容读取逻辑和上面一致

不过需要先通过LuaRocks安装库:luarocks install luafilesystem

希望这个方案能帮你搞定需求,有任何细节疑问随时提!

内容的提问来源于stack exchange,提问作者Ravin

火山引擎 最新活动