2014-12-15 2 views
2

Я пытаюсь получить имя всех файлов сохраняются в двух папках, имя сохраняются как:Сканирование папок с использованием Lua

1.lua 2.lua 3.lua 4.lua and so on 

имя папки являются:

first folder : "/const/" 
second folder: "/virt/" 

, что Я пытаюсь сделать только получить количество файлов, и это работает, но не в правильном порядке, когда я получаю файл 17, например, я получаю 17-ю передачу от функции до 15, и это вызывает у меня проблему здесь код функции, которую я использую:

local virt_path = "/virt/" 
local const_path = "/const" 
local fs = require "lfs" 

local const = {} 

for num = 1, (numberoffile)do -- numberoffile is predfined and can't be change 
    const[num] = assert(
     dofile (const_path .. mkfilename(num)), 
     "Failed to load constant ".. num ..".") 
end 

local function file_number() --this is the function that causes me a headach 
    local ci, co, num = ipairs(const) 
    local vi, vo, _ = fs.dir(virt_path) 
    local function vix(o) 
     local file = vi(o) 
     if file == nil then return nil end 
     local number = file:match("^(%d+).lua$") 
     if number == nil then return vix(o) end 
     return tonumber(number) 
    end 
    local function iter(o, num) 
     return ci(o.co, num) or vix(o.vo, num) 
    end 
    return iter, {co=co, vo=vo}, num 
end 

Как я уже сказал, функция delive возвращает значения возврата, но не правильный арифметический порядок.

любая идея, что я делаю неправильно здесь?

+0

У вас есть 2 варианта: 1. получить все файлы в таблице, сортировать и перебирать эту таблицу; 2. итерации по числу (1..N) и проверьте, существует ли этот файл (это работает, если у вас нет отверстий) – moteus

+0

@moteus вы могли бы привести конкретный пример этого? – Engine

ответ

2

Я использую свою библиотеку path [1].

1 Заполняем таблицу с именами файлов

local t = {} 
for f in path.each("./*.lua", "n") do 
    t[#t + 1] = tonumber((path.splitext(f))) 
end 

table.sort(t) 

for _, i in ipairs(t) do 
    -- do work 
end 

2 Мы проверяем файлы существует

for i = 1, math.huge do 
    local p = "./" .. i .. ".lua" 
    if not path.exists(p) then break end 
    -- do work 
end 

[1] https://github.com/moteus/lua-path

Смежные вопросы