Wie man Liste der Verzeichnisse in Lua erhält
Ich brauche eine Liste von Verzeichnis in LUA
Angenommen ich habe ein Verzeichnis-Pfad "C:\Program Dateien"
Brauche ich eine Liste aller Ordner in einem bestimmten Pfad und wie nach jedem bestimmten Ordner in diese Liste.
Beispiel
Benötigen eine Liste aller Ordner im Pfad "C:\Program Dateien"
Unten sind Ordner-Namen, die in den oben genannten Pfad
- test123
- test4567
- Ordner 123
- Ordner 456
- Ordner 456 789
Brauchen die oben in einer Liste und dann auf die Suche nach einer bestimmten Zeichenfolge, wie Ordner 456 im Ordner 456 789 nur.
Haben Versucht folgenden code. Etwas, was ich bin fehlt unten:-
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\\")
InformationsquelleAutor der Frage che | 2011-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nutzen Sie die einfache Möglichkeit, installieren Sie lfs. Verwenden Sie dann die folgenden Konstrukte zu finden, was Sie brauchen:
beachten Sie, dass ein backslash entspricht
[[\]]
gleich"\\"
ist, und dass in windows /ist auch erlaubt, wenn Sie nicht verwendet werden, die auf die cmd selbst (korrigiert mich, wenn ich falsch Liege).InformationsquelleAutor der Antwort jpjacobs
Ich hasse es zu installieren-Bibliotheken (insbesondere jene, die mir verwenden möchten installer-Pakete installieren). Wenn Sie auf der Suche nach einer sauberen Lösung für ein directory-listing auf einen absoluten Pfad in der Lua, suchen Sie nicht weiter.
Aufbauend auf die Antwort von sylvanaar zur Verfügung gestellt, erstellte ich eine Funktion gibt ein array zurück, der alle Dateien für ein bestimmtes Verzeichnis (absoluter Pfad ist erforderlich). Dies ist meine bevorzugte Umsetzung, wie es funktioniert auf allen meinen Maschinen.
Wenn Sie Windows verwenden, müssen Sie ein bash-client installiert, so dass die 'ls' - Befehl funktioniert - alternativ können Sie den Befehl dir verwenden, sylvanaar zur Verfügung gestellt:
InformationsquelleAutor der Antwort rhoster
*Für Windows
Ausgänge:
Jedes mal durch die Schleife erhalten Sie einen neuen Ordnernamen ein. Ich wählte, um es zu drucken als ein Beispiel.
InformationsquelleAutor der Antwort sylvanaar
Ich weiß nicht, wie das installieren von Bibliotheken und arbeite auf einem eingebetteten Gerät mit weniger Speicher macht dann einen pc. Ich fand heraus, dass mit der 'ls' - Befehl führt zu einem out of memory. So habe ich eine Funktion, die verwendet 'finden', um das problem zu lösen.
Diese Weise war es möglich zu halten Speichernutzung stabil und Schleife alle 30k Dateien.
InformationsquelleAutor der Antwort Gert Oussoren
IIRC, immer das directory listing ist nicht möglich, mit Lager Lua. Sie schreiben zu müssen-etwas Leim-code selbst, oder verwenden Sie LuaFileSystem. Letzteres ist wahrscheinlich den Weg des geringsten Widerstandes für Sie. Einen schnellen scan des docs zeigt
lfs.dir()
die Sie mit einem iterator können Sie verwenden, um die Verzeichnisse, die Sie suchen. An diesem Punkt, können Sie dann tun Sie Ihre string-Vergleich, um die bestimmten Verzeichnisse aus, die Sie benötigen.InformationsquelleAutor der Antwort Glenn McAllister
Sie auch installieren und verwenden Sie die ' Pfade ' - Modul. Dann können Sie dies ganz einfach wie folgt:
-- Dieses druckt alle Ordner-Namen
Optional, Sie können auch nach Dateien mit einer bestimmten Erweiterung durch Austausch
fileName:find('$')
mitfileName:find('txt' .. '$')
Wenn Sie auf einem Unix-basierten Computer können Sie eine numerisch sortiert Liste der Dateien mit dem folgenden code:
Den zweiten code schließt auch Dateien wie '.' und '..'. Es ist also gut zu gehen!
InformationsquelleAutor der Antwort Amir