Lua — Как мне отсортировать все найденные файлы (через LFS) в алфавитном порядке?

#lua

#lua

Вопрос:

Пожалуйста, кто-нибудь может помочь мне завершить мою функцию, которая может сортировать все имена файлов, которые я извлек через файловую систему Lua, поскольку я, похоже, не могу этого сделать? Код приведен ниже. (Буду признателен за любую помощь)

 
local lfs = require "lfs" 
local json = require("json")
local tt = {}

function browseFolder(root)
    for entity in lfs.dir(root) do
        if entity~="." and entity~=".." then
        
            local fullPath=root..'/'..entity
            local mode=lfs.attributes(fullPath,"mode")
            if mode=="file" and entity: match "%.mkv$" then
            
                table.insert(tt, { 
                    filename = entity,
                    folder = root})
                
            elseif mode=="directory" then
                
                browseFolder(fullPath);
            end
        end
    end
end

browseFolder(".")

--print(tt)

table.sort(tt, function(a, b) return a:filename() < b:filename() end)
                
for k,d in ipairs(tt) do
    --print(d.filename)
    print(k, d.filename, d.folder)
--end   
end
 

И… если кто-нибудь знает способ выполнить другую функцию, которая также включает дополнительные атрибуты файла, такие как размер файла, дата создания и т. Д. А затем иметь возможность сортировать по любому из них, это было бы здорово.

Ответ №1:

используйте lfs.attributes и полный путь для доступа к файлу:

 local lfs = require "lfs" 
local json = require("json")
local tt = {}

function browseFolder(root)
    for entity in lfs.dir(root) do
        if entity~="." and entity~=".." then
        
            local fullPath=root..'/'..entity
            local mode=lfs.attributes(fullPath,"mode")
            if mode=="file" and entity: match "%.*$" then -- all files
            
                table.insert(tt, { 
                    filename = entity,
                    folder = root,
                    date_ch = lfs.attributes(root .. '//'.. entity, "change") 
                    })
                print(entity,root)
            elseif mode=="directory" then
                
                browseFolder(fullPath);
            end
        end
    end
end

browseFolder(".")


table.sort(tt, function(a, b) return a.date_ch < b.date_ch end) -- sort by date of change
                
for k,d in pairs(tt) do
    print(k, d.filename, os.date("%c",d.date_ch) , d.folder)
end
 

и вместо a:filename() < b:filename() этого используйте a.filename < b.filename