【发布时间】:2020-05-05 12:59:26
【问题描述】:
删除除数组中的文件外的所有文件
files = {"init.lua", "client.lua", "config.htm", "server.lua", "update.lua"}
【问题讨论】:
删除除数组中的文件外的所有文件
files = {"init.lua", "client.lua", "config.htm", "server.lua", "update.lua"}
【问题讨论】:
如the documentation 中所述,您可以使用file.list() 获取文件系统上所有文件的列表。
这会返回一个地图file name => file size;所以文件名是表键,你可以使用它。
请记住:
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
【讨论】:
首先,我们可以创建 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 循环,我们将获得从 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 命令。在你想运行它的地方可能需要将它更改为ls(从io.popen([[dir "" /b]]):lines() 到io.popen([[ls "" /b]]):lines())。
【讨论】: