如何在Lua中获取目录列表

我需要一个在 LUA 中列出目录的列表

假设我有一个目录路径为 "C:\Program Files"

我需要一个特定路径中所有文件夹的列表,以及如何在该列表中搜索任何特定文件夹。

例如

需要一个路径中所有文件夹的列表 "C:\Program Files"

以下是上面路径中的文件夹名称

  1. test123

  2. test4567

  3. folder 123

  4. folder 456

  5. 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

点赞
stackoverflow用户241148
stackoverflow用户241148

我记得,使用原始的 Lua 无法获取目录列表。你需要自己编写一些粘合代码,或者使用LuaFileSystem。后者可能是最简单的方法。快速浏览文档显示了lfs.dir(),他将为你提供迭代器,您可以使用它来获取你所需要的目录。此时,您可以使用字符串比较来获取需要的特定目录。

2011-03-14 19:24:49
stackoverflow用户513763
stackoverflow用户513763

采用简单的方式,安装 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 自身上使用,也可以使用 /(帮我纠正一下如果我错了的话)。

2011-03-14 20:02:27
stackoverflow用户151501
stackoverflow用户151501
对于 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 ...

```

每次循环时,您都会得到一个新的文件夹名称。我选择将其打印为示例。

2012-04-10 16:09:42
stackoverflow用户974053
stackoverflow用户974053

我厌恶安装库(尤其是那些要求我使用安装程序包来安装它们的库)。如果您正在寻找在 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'
2012-06-21 02:26:58
stackoverflow用户1796613
stackoverflow用户1796613

我也不喜欢安装库,并且我在一个内存比 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
2014-08-12 14:12:55
stackoverflow用户2838606
stackoverflow用户2838606

你还需要安装并使用 ' 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]) -- 这会打印第一个文件名

第二个代码还会排除文件“.”和“..”。所以它可以正常使用!

2016-04-13 21:00:40
stackoverflow用户5697743
stackoverflow用户5697743

不要解析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或其他特殊库。

2019-04-23 13:31:54
stackoverflow用户805355
stackoverflow用户805355

下面是val says Reinstate Monica解决方案的一些修复:

function scandir(directory)
    local pfile =

这个函数现在按目录过滤,排除目录本身,并仅打印名称。

2019-12-17 06:24:09