Comment obtenir la liste des répertoires dans Lua

J'ai besoin d'une liste de répertoires dans LUA

Supposons que j'ai un chemin de répertoire comme "C:Program fichiers"

J'ai besoin d'une liste de tous les dossiers de ce chemin particulier et la façon de rechercher tout dossier particulier dans cette liste.

Exemple

Besoin d'une liste de tous les dossiers dans le chemin "C:Program fichiers"

Ci-dessous sont le nom du dossier dans le chemin ci-dessus

  1. test123
  2. test4567
  3. dossier 123
  4. dossier 456
  5. Dossier 456 789

    Besoin d'obtenir ce qui précède dans une liste, puis de rechercher une chaîne particulière comme le dossier 456 dans le dossier 456 789 seulement.

Ont essayé le code ci-dessous. Quelque chose qui me manque ci-dessous: -

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\")
26
demandé sur Amir 2011-03-14 22:05:22

6 réponses

Prenez le moyen facile, installez lfs. Utilisez ensuite les constructions suivantes pour trouver ce dont vous avez besoin:

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

Notez qu'une barre oblique inverse est égale à [[\]] égale à "\\", et que dans windows / est également autorisé s'il n'est pas utilisé sur le cmd lui-même (corrigez - moi si je me trompe sur celui-ci).

24
répondu jpjacobs 2011-03-14 20:02:27

Je déteste avoir à installer des bibliothèques (en particulier celles qui veulent que j'utilise des packages d'installation pour les installer). Si vous cherchez une solution propre pour une liste de répertoires sur un chemin absolu dans Lua, ne cherchez pas plus loin.

En M'appuyant sur la réponse fournie par sylvanaar, j'ai créé une fonction qui renvoie un tableau de tous les fichiers pour un répertoire donné (chemin absolu requis). C'est mon implémentation préférée, car elle fonctionne sur toutes mes machines.

-- 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 vous utilisez Windows, vous aurez besoin d'avoir un client bash installé pour que la commande' ls ' fonctionne-alternativement, vous pouvez utiliser la commande dir fournie par sylvanaar:

'dir "'..directory..'" /b /ad'
47
répondu rhoster 2016-02-17 20:06:03
 for dir in io.popen([[dir "C:\Program Files\" /b /ad]]):lines() do print(dir) end

* Pour Windows

Sorties:

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

Chaque fois que vous parcourez la boucle, un nouveau nom de dossier vous est donné. J'ai choisi de l'imprimer à titre d'exemple.

15
répondu sylvanaar 2012-04-10 16:15:56

Je n'aime pas non plus installer des bibliothèques et je travaille sur un périphérique embarqué avec moins de puissance de mémoire qu'un pc. J'ai découvert que l'utilisation de la commande ' ls ' conduisait à un manque de mémoire. J'ai donc créé une fonction qui utilise 'find' Pour résoudre le problème.

De cette façon, il était possible de maintenir l'utilisation de la mémoire stable et de boucler tous les fichiers 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
répondu Gert Oussoren 2015-03-04 10:05:54

IIRC, obtenir la liste du répertoire n'est pas possible avec stock Lua. Vous devez écrire du code de colle vous-même, ou utiliser LuaFileSystem . Ce dernier est probablement le chemin de moindre résistance pour vous. Une analyse rapide de la documentation montre lfs.dir(), qui vous fournira un itérateur vous pouvez utiliser pour obtenir les répertoires que vous recherchez. À ce stade, vous pouvez ensuite faire votre comparaison de chaînes pour obtenir les répertoires spécifiques dont vous avez besoin.

2
répondu Glenn McAllister 2011-03-14 19:24:49

Vous installez et utilisez également le module' paths'. Ensuite, vous pouvez facilement le faire comme suit:

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)

-- cela affichera tous les noms de dossiers

En option, vous pouvez également rechercher des noms de fichiers avec une extension spécifique en remplaçant fileName:find('$') par fileName:find('txt' .. '$')

Si vous utilisez une machine Unix, vous pouvez obtenir une liste de fichiers triés numériquement en utilisant le code suivant:

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

Le deuxième code exclut également les fichiers tels que '.' et '..'. Il est donc bon de Allez-y!

1
répondu Amir 2016-11-14 10:29:33