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
- prueba123
- test4567
- carpeta 123
- carpeta 456
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.