本来lua遍历文件夹下压缩包内容、路径可以通过加载模块: require(“lfs”) 和 require(“zip”) 来解决。
但是本人通过c++调用lua时,只要lua脚本中使用require加载模块,就会出错。
因此为了能够让c++通过lua,解压当前路径下压缩包,并读取其中文件内容。并没有使用加载模块的方法,而是结合os.execute()系统命令和7z压缩包命令行。
lua调用os.execute()系统命令,其实就相当于c中调用system()命令,也就相当于windows下cmd命令,因此可以自行查找相关命令。
本例中,压缩包在第一级目录,lua脚本放在script文件夹中。
需求为:解压第一级目录的压缩包到脚本所在目录,然后读取解压出来的文件夹其中的xml文件内容数据,最后再把解压出来的整个文件夹删除。
--当前为windows环境
--获取当前路径
function getcurrDir()
os.execute("cd > cd.tmp")
local f = io.open("cd.tmp", r)
local cwd = f:read("*a")
f:close()
os.remove("cd.tmp")
cwd = string.sub(cwd, 1, -2)
cwd = string.gsub(cwd,"\\","\\\\")
return cwd
end
--解压当前目录下指定压缩包到指定文件夹,并返回其中xml文件数据
zipname = "CN-PA-PRSS-10.zip"
curpath = getcurrDir()
function getZipData(zipname)
dirname = "zipfile"
os.execute("7z x ../"..zipname.." -o"..dirname) --解压上级目录的压缩包,到当前脚本所在目录指定文件夹中
os.execute("dir "..dirname.."/s/b/a-d > dir.tmp") --输出指定文件夹下所有子目录中属性不为目录的文件名,到临时文件
local f = io.open("dir.tmp", r)
local cwd = f:read("*a")
f:close()
os.remove("dir.tmp")
cwd = string.sub(cwd, 1, -2)
cwd = string.gsub(cwd, "\\", "\\\\")
local f = io.open(cwd, r)
local data = f:read("*a")
f:close()
os.execute("rd /s/q " ..curpath.."\\"..dirname) --删除解压出来的文件夹
return data
end
getZipData(zipname)