在 NodeMCU Lua 中删除除数组中文件以外的所有文件

删除除数组中文件以外的所有文件 files = {"init.lua", "client.lua", "config.htm", "server.lua", "update.lua"}

点赞
用户6487283
用户6487283

首先,我们可以创建三个类似数组的表格:一个用于受保护的文件(你提供的那个),另一个用于列出目录中的所有文件,最后一个用于选择我们将要删除的文件。

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 循环,我们将从 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) -- 此函数无法删除文件夹
end

就是这样。我必须承认,我在 Windows 上运行它,因此我使用了 dir 命令。在你想运行它的地方,可能需要将其更改为 ls(从 io.popen([[dir "" /b]]):lines()io.popen([[ls "" /b]]):lines())。

2020-01-20 07:01:46
用户4984564
用户4984564

文档 中所述,可以使用 file.list() 获取文件系统上所有文件的列表。

这将返回一个映射 文件名 => 文件大小;因此文件名是表键,可以利用它。

请记住:

  • Lua 中的表索引是可以接受的快速的
  • 键-值对可以通过将值设置为 nil 来删除

所以我们可以这样做:

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

-- 删除白名单中的文件
for _, filename in ipairs(whitelist) do
   files[filename] = nil
end

-- 删除其余文件
for filename in pairs(files) do
   file.remove(filename)
end
2020-01-20 08:14:11