una trabajo ruta obtener nombre listas listar generador fijar directorio carpetas carpeta cambiar archivos archivo lua filenames directory-listing

lua - trabajo - obtener archivos de un directorio c#



Cómo obtener la lista de directorios en lua (6)

IIRC, obtener el listado de directorio no es posible con stock Lua. Necesita escribir un código de pegamento usted mismo o usar LuaFileSystem . Este último es muy probablemente el camino de menor resistencia para ti. Un escaneo 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 momento, puede hacer la comparación de cadenas para obtener los directorios específicos que necesita.

Necesito una lista de directorio en LUA

Supongamos que tengo una ruta de directorio como "C: / Archivos de programa"

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

Ejemplo

Necesita una lista de todas las carpetas en la ruta "C: / Archivos de programa"

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

  1. prueba123
  2. test4567
  3. carpeta 123
  4. carpeta 456
  5. carpeta 456 789

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

Han intentado por 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//")


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.

Sobre la base de la respuesta que proporcionó sylvanaar, creé una función que devuelve una matriz de todos los archivos para un directorio determinado (se requiere una 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, deberá tener instalado un cliente bash para que funcione el comando ''ls''; alternativamente, puede usar el comando dir que sylvanaar proporcionó:

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


También instala y utiliza el módulo '' paths ''. Entonces puedes hacer esto fácilmente como sigue:

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)

- Esto imprimirá todos los nombres de las carpetas.

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

Si está ejecutando en una máquina basada en Unix, puede obtener una lista de archivos ordenada numéricamente usando 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 ir!


Tampoco me gusta instalar bibliotecas y estoy trabajando en un dispositivo integrado con menos capacidad de memoria que una PC. Descubrí que usar el comando ''ls'' lleva a una memoria insuficiente. Así que creé una función que usa ''buscar'' para resolver el problema.

De esta manera fue posible mantener el uso de la memoria constante y hacer un bucle con todos los archivos de 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


Toma el camino facil, instala lfs. Luego usa las siguientes construcciones para encontrar lo que necesitas:

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 está permitido si no se usa en el cmd (corríjame si me equivoco en este caso).


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

*Para ventanas

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 que pasas por el bucle se te da un nuevo nombre de carpeta. Elegí imprimirlo como ejemplo.