如何在Lua中获取目录列表
我需要一个在 LUA 中列出目录的列表
假设我有一个目录路径为 "C:\Program Files"
我需要一个特定路径中所有文件夹的列表,以及如何在该列表中搜索任何特定文件夹。
例如
需要一个路径中所有文件夹的列表 "C:\Program Files"
以下是上面路径中的文件夹名称
test123
test4567
folder 123
folder 456
folder 456 789
需要获得上述列表,然后必须在文件夹 456 789 中搜索特定字符串,例如文件夹 456。
已尝试以下代码。我错过了些什么:
功能本地函数Loc_Lines(str)
-
本地退役= {} --0行
当段时
本地,,行,尾端=字符串.find(段,“(.-)\ n(.+)”)
表插入(当役,行或段)
段=尾部
打印(str)
业务完毕
本地函数Loc_ShellCommand(cmd)
-
本地段=无
-
本地f= io.popen(cmd) - 没有命令仍然返回句柄:()
如果f然后
段= f:read'*a'
打印(段)
f:关闭()
结束
如果str ==“”,则将无输出视为失败(我们无法告知..)
打印(“嗨”)
- 去掉终止换行符(如果有的话,这会使一行分析更易)
如果段则
如果string.sub(段,-1)==''\ n'则
段= string.sub(段,1,-2)
结束
终止
返回字符串
结论
本地函数Loc_DirCmd(cmd)
打印(cmd)
本地段= Loc_ShellCommand(cmd)
返回Loc_Lines(段)
结论
本地函数Loc_DirList(dirname)
本地当役= {}
本地查找= {}
本地tbl = Loc_DirCmd(“dir / AD / B”..dirname) - 仅dirs
- 在每个dir行上添加斜杠
-
对于i,v在ipairs(tbl)中做
表插入(当役,v..' \\')
查找[v] =真实
结束
- 返回正斜杠
-
如果真的是如此then
对于i = 1,table.getn(ret)做
ret [i] = string.gsub(ret [i],'\\','/')
打印(ret [i])
结束
结束
返回役
结论
Loc_DirList(“C:\ Program Files \\”)
原文链接 https://stackoverflow.com/questions/5303174
采用简单的方式,安装 lfs。然后使用以下结构来查找您需要的内容:
require'lfs'
for file in lfs.dir[[C:\Program Files]] do
if lfs.attributes(file,"mode") == "file" then print("found file, "..file)
elseif lfs.attributes(file,"mode")== "directory" then print("found dir, "..file," containing:")
for l in lfs.dir("C:\\Program Files\\"..file) do
print("",l)
end
end
end
请注意,反斜杠等于 [[\]]
等于 "\\"
,在 Windows 上,如果未在 cmd 自身上使用,也可以使用 /(帮我纠正一下如果我错了的话)。
对于 Windows:
输出:
Adobe Bitcasa Bonjour Business Objects Common Files DVD Maker IIS Internet Explorer iPod iTunes Java Microsoft Device Emulator Microsoft Help Viewer Microsoft IntelliPoint Microsoft IntelliType Pro Microsoft Office Microsoft SDKs Microsoft Security Client Microsoft SQL Server Microsoft SQL Server Compact Edition Microsoft Sync Framework Microsoft Synchronization Services Microsoft Visual Studio 10.0 Microsoft Visual Studio 9.0 Microsoft.NET MSBuild ...
```
每次循环时,您都会得到一个新的文件夹名称。我选择将其打印为示例。
我厌恶安装库(尤其是那些要求我使用安装程序包来安装它们的库)。如果您正在寻找在 Lua 中绝对路径上进行目录列表的清晰解决方案,请不要再找了。
在 sylvanaar 提供的答案基础上,我创建了一个函数,该函数返回给定目录(绝对路径必需)中所有文件的数组。这是我首选的实现,因为它在我的所有计算机上都能工作。
-- Lua implementation of PHP scandir function
function scandir(directory)
local i, t, popen = 0, {}, io.popen
local pfile = popen('ls -a "'..directory..'"')
for filename in pfile:lines() do
i = i + 1
t[i] = filename
end
pfile:close()
return t
end
如果您正在使用 Windows,则需要安装 bash 客户端,以使“ls”命令运行 – 或者,您可以使用 sylvanaar 提供的 dir 命令:
'dir "'..directory..'" /b /ad'
我也不喜欢安装库,并且我在一个内存比 PC 更少的嵌入式设备上工作。我发现使用 'ls' 命令会导致内存不足。所以我创建了一个使用 'find' 解决问题的函数。
这样可以保持内存使用稳定并循环遍历所有的 30k 个文件。
function dirLookup(dir)
local p = io.popen('find "'..dir..'" -type f') --打开目录查找文件,将数据保存在p中。通过提供 '-type f' 参数,它返回所有文件。
for file in p:lines() do --循环遍历所有文件
print(file)
end
end
你还需要安装并使用 ' paths' 模块。然后,你可以按照以下步骤轻松完成:
require 'paths'
currentPath = paths.cwd() -- 当前工作目录
folderNames = {}
for folderName in paths.files(currentPath) do
if folderName:find('$') then
table.insert(folderNames, paths.concat(currentPath, folderName))
end
end
print (folderNames)
-- 这会打印所有文件夹名称。
你也可以替换 fileName:find('$')
为 fileName:find('txt' .. '$')
来查找具有特定扩展名的文件名称。
如果你在运行基于 Unix 的机器上,则可以使用以下代码获取数字排序的文件列表:
thePath = '/home/Your_Directory'
local handle = assert(io.popen('ls -1v ' .. thePath))
local allFileNames = string.split(assert(handle:read('*a')), '\n')
print (allFileNames[1]) -- 这会打印第一个文件名
第二个代码还会排除文件“.”和“..”。所以它可以正常使用!
不要解析ls
,它很危险!在Linux上使用带零终止字符串的find
替代:
function scandir(directory)
local i, t = 0, {}
local pfile = assert(io.popen(("find '%s' -maxdepth 1 -print0"):format(directory), 'r'))
local list = pfile:read('*a')
pfile:close()
for filename in list:gmatch('[^\0]+') do
i = i + 1
t[i] = filename
end
return t
end
警告:然而,作为所接受的答案,如果目录名称中包含'
,则此方法可能会被利用。唯一安全的解决方案是使用lfs
或其他特殊库。
下面是val says Reinstate Monica解决方案的一些修复:
function scandir(directory)
local pfile =
这个函数现在按目录过滤,排除目录本身,并仅打印名称。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我记得,使用原始的 Lua 无法获取目录列表。你需要自己编写一些粘合代码,或者使用LuaFileSystem。后者可能是最简单的方法。快速浏览文档显示了
lfs.dir()
,他将为你提供迭代器,您可以使用它来获取你所需要的目录。此时,您可以使用字符串比较来获取需要的特定目录。