Cómo obtener una lista de directorios en Lua


Necesito una lista de directorio en LUA

Supongamos que tengo una ruta de directorio como "C:\Program Archivos"

Necesito una lista de todas las carpetas en esa ruta en particular y cómo buscar en cualquier carpeta en particular en esa lista.

Ejemplo

Necesita una lista de toda la carpeta en ruta "C:\Program Archivos"

A continuación se muestra el nombre de la carpeta en la ruta anterior

  1. test123
  2. test4567
  3. carpeta 123
  4. carpeta 456
  5. Carpeta 456 789

    Necesita obtener lo anterior en una lista y luego tiene que buscar una cadena en particular como la carpeta 456 en la carpeta 456 789 solamente.

Han Intentado debajo del código. Algo que me falta a continuación: -

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\\")
Author: Amir, 2011-03-14

6 answers

Tome el camino fácil, instale lfs. A continuación, utilice las siguientes construcciones para encontrar lo que necesita:

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

Observe que una barra invertida es igual a [[\]] es igual a "\\", y que en windows / también se permite si no se usa en el propio cmd (corríjame si me equivoco en este).

 24
Author: jpjacobs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-14 20:02:27

Odio tener que instalar bibliotecas (especialmente aquellas que quieren que use paquetes de instalación para instalarlas). Si está buscando una solución limpia para una lista de directorios en una ruta absoluta en Lua, no busque más.

Basándome en la respuesta que sylvanaar proporcionó, creé una función que devuelve un array de todos los archivos para un directorio dado (se requiere ruta absoluta). Esta es mi implementación preferida, ya que funciona en todas mis máquinas.

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

Si está utilizando Windows, necesitará tener un cliente bash instalado para que el comando' ls ' funcione-alternativamente, puede usar el comando dir que sylvanaar proporcionó:

'dir "'..directory..'" /b /ad'
 47
Author: rhoster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-17 20:06:03
 for dir in io.popen([[dir "C:\Program Files\" /b /ad]]):lines() do print(dir) end

*Para Windows

Salidas:

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

Cada vez a través del bucle se le da un nuevo nombre de carpeta. Elegí imprimirlo como ejemplo.

 15
Author: sylvanaar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-10 16:15:56

Tampoco me gusta instalar bibliotecas y estoy trabajando en un dispositivo embebido con menos potencia de memoria que un pc. Me enteré de que el uso de' ls ' comando llevar a un fuera de memoria. Así que creé una función que usa 'find' para resolver el problema.

De esta manera fue posible mantener el uso de memoria constante y el bucle de todos los archivos 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
 11
Author: Gert Oussoren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-04 10:05:54

IIRC, obtener la lista de directorios no es posible con stock Lua. Necesita escribir algún código glue usted mismo, o usar LuaFileSystem. Este último es probablemente el camino de menor resistencia para usted. Un análisis rápido de los documentos muestra lfs.dir() que le proporcionará un iterador que puede usar para obtener los directorios que está buscando. En ese punto, puede hacer su comparación de cadenas para obtener los directorios específicos que necesita.

 2
Author: Glenn McAllister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-14 19:24:49

También instala y utiliza el módulo ' paths'. Entonces puedes hacer esto fácilmente de la siguiente manera:

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)

Print Esto imprimirá todos los nombres de carpetas

Opcionalmente, también puede buscar nombres de archivo con una extensión específica reemplazando fileName:find('$') por fileName:find('txt' .. '$')

Si se está ejecutando en una máquina basada en Unix, puede obtener una lista ordenada numéricamente de archivos utilizando el siguiente código:

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

El segundo código también excluye archivos como '.' y '..'. Así que es bueno ¡vamos!

 1
Author: Amir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-14 10:29:33