Подтвердить что ты не робот

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

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

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

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

Пример

Требуется список всей папки в папке "C:\Program Files"

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

  • test123
  • test4567
  • папка 123
  • папка 456
  • папка 456 789

    Нужно получить вышеприведенное в списке, а затем искать какую-либо строку, такую ​​как папка 456, только в папке 456 789.

Пробовали ниже код. Что-то мне не хватает ниже: -

local function Loc_Lines( str )
--
local ret= {}   -- 0 lines

while str do
    local _,_,line,tail= string.find( str, "(.-)\n(.+)" )
    table.insert( ret, line or str )
    str= tail
  Print (str)
end

return ret
end


local function Loc_ShellCommand( cmd )
--
local str= nil

    --
    local f= io.popen( cmd )    -- no command still returns a handle :(
     if f then

        str= f:read'*a'
    Print(str)
        f:close()
    end

    if str=="" then   -- take no output as a failure (we can't tell..)
    Print("hi")
        str= nil
    end

-- Remove terminating linefeed, if any (eases up one-line analysis)
--
if str then
    if string.sub( str, -1 ) == '\n' then
        str= string.sub( str, 1, -2 )
    end
end

return str
 end


 local function Loc_DirCmd( cmd )

 Print(cmd)

  local str= Loc_ShellCommand( cmd )



 return Loc_Lines(str)
 end


local function Loc_DirList( dirname )

 local ret= {}

    local lookup= {}

   local tbl= Loc_DirCmd( "dir /AD /B "..dirname )   -- only dirs

    -- Add slash to every dir line
    --
    for i,v in ipairs(tbl) do
        table.insert( ret, v..'\\' )
        lookup[v]= true
    end       


    -- Return with forward slashes
    --
    if true then
        for i=1,table.getn(ret) do
            ret[i]= string.gsub( ret[i], '\\', '/' )
     Print (ret[i])
        end
    end


   return ret
 end


 Loc_DirList("C:\\Program Files\\")
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Таким образом, можно было сохранить память и установить все 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

Ответ 5

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

Ответ 6

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

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

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