Как получить список каталогов в Lua

Мне нужен список каталогов в LUA

предположим, что у меня есть путь к каталогу как "C:Program файлы"

Мне нужен список всех папок в этом конкретном пути и как искать любую конкретную папку в этом списке.

пример

нужен список всех папок в пути "C:Program файлы"

Ниже приведены имена папок в приведенном выше пути

  1. test123
  2. test4567
  3. 123
  4. папку 456

6 ответов


возьмите простой способ, Установите 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 (исправьте меня, если я ошибаюсь в этом).


Я ненавижу устанавливать библиотеки (особенно те, которые хотят, чтобы я использовал пакеты установщика для их установки). Если вы ищете чистое решение для списка каталогов на абсолютном пути в 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 " работала - в качестве альтернативы вы можете использовать команду dir, предоставленную sylvanaar:

'dir "'..directory..'" /b /ad'

 for dir in io.popen([[dir "C:\Program Files\" /b /ad]]):lines() do print(dir) end

*Для 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
...

каждый раз, когда через цикл вам дается новое имя папки. Я решил напечатать его в качестве примера.


Мне тоже не нравится устанавливать библиотеки и я работаю на встроенном устройстве с меньшей мощностью памяти, чем ПК. Я узнал, что использование команды " ls " приводит к нехватке памяти. Поэтому я создал функцию, которая использует "find" для решения проблемы.

таким образом, можно было поддерживать устойчивое использование памяти и цикл всех файлов 30k.

function dirLookup(dir)
   local p = io.popen('find "'..dir..'" -type f')  --Open directory look for files, save data in p. By giving '-type f' as parameter, it returns all files.     
   for file in p:lines() do                         --Loop through all files
       print(file)       
   end
end

IIRC, получение списка каталогов невозможно с запасом Lua. Вам нужно написать код клея самостоятельно или использовать LuaFileSystem. Последнее, скорее всего, путь наименьшего сопротивления для вас. Быстрое сканирование документов показывает lfs.dir() который предоставит вам итератор, который вы можете использовать для получения каталогов, которые вы ищете. На этом этапе вы можете выполнить сравнение строк, чтобы получить нужные вам каталоги.


вы также устанавливаете и используете 'пути'. Затем вы можете легко сделать это следующим образом:

require 'paths'

currentPath = paths.cwd() -- Current working directory
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]) -- This will print the first file name

второй код также исключает такие файлы, как '.' и.' .'. Так что все хорошо!