Удалите все файлы кроме массива в NodeMCU Lua - PullRequest
0 голосов
/ 19 января 2020

Удалить все файлы, кроме файлов в массиве files = {"init.lua", "client.lua", "config.htm", "server.lua", "update.lua"}

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Как упомянуто в документации , вы можете получить список всех файлов в файловой системе, используя file.list().

Возвращает карту file name => file size; поэтому имя файла - это ключ таблицы, который вы можете использовать.

Имейте в виду, что:

  • Индексирование таблицы в Lua приемлемо быстро
  • Пары ключ-значение можно удалить, установив значение nil

Таким образом, мы можем сделать что-то вроде этого:

local whitelist = {"init.lua", "client.lua", "config.htm", "server.lua", "update.lua"}
local files = file.list()

-- Remove files found in the whitelist
for _, filename in ipairs(whitelist) do
   files[filename] = nil
end

-- Delete the remaining files
for filename in pairs(files) do
   file.remove(filename)
end
0 голосов
/ 20 января 2020

Во-первых, мы можем создать 3 массива-подобные таблицы: одну для защищенных файлов (ту, которую вы предоставили), другую для вывода списка всех файлов в каталоге и последнюю для выбора файлов, которые мы будем удалять.

local protected = {"init.lua", "client.lua", "config.htm", "server.lua", "update.lua"}
local found = {}
local delete = {}

Далее мы соберем содержимое каталога:

for name in io.popen([[dir "" /b]]):lines() do
   table.insert(found, name)
end

Стоит отметить, что он также получит папки, но здесь это не имеет значения, так как мы выиграли ' удалить их все равно не удастся.

Теперь с помощью простой функции и for-l oop мы получим значения от found до delete, за исключением значений в protected:

local function contains(t, v)
    for index, value in ipairs(t) do
        if value == v then
            return true
        end
    end
    return false
end

for _, value in ipairs(found) do
   if not contains(protected, value) then
      table.insert(delete, value)
   end
end

Теперь мы удаляем файлы в delete

for _, filename in ipairs(delete) do
   print("Deleting "..filename.." (unless it is a folder)")
   os.remove(filename) -- this function is simply unable to delete folders
end

И это все. Должен признать, я запускаю его на Windows, поэтому я использовал команду dir. Там, где вы хотите запустить его, может потребоваться изменить его на lsio.popen([[dir "" /b]]):lines() на io.popen([[ls "" /b]]):lines()).

...