在项目开发中,为了提高开发效率往往需要开发一些辅助工具。最近在公司用lua帮拓展了一个资源扫描的工具,这个工具的功能就是从原始demo下指定目标资源文件,对该文件进行读取并筛选过滤一遍然后拷贝到最终demo对应的文件目录下。

我们知道要读取一个文件必须指定对应路径,而我们在一个大型游戏软件开发中每个人所提交上去的资源都是在不同文件目录下的。所以原先的做法就是手动去把路径一个一个贴出来,整合记录到一个文本中,扫资源的时候先去该文本一行一行的拿路径,

根据路径获取目标文件并进行筛选拷贝操作等等。如果一个目录下的资源文件不多还好,要是策划批量上传了一堆特效文件或者贴图的话就苦逼了。qc要一个一个的去贴出路径来,这样的话工作效率就低下了,主要是文件特别多还会出现漏交的时候。

一旦漏交就相当于隐匿了一个巨大的炸弹随时会爆炸使游戏崩掉。所以为了解决这个问题,使用lua的lfs.dll帮了大忙(我们的资源扫描工具是用lua弄的)。

改进的想法是在记录路径的file_list.txt文件直接贴目标文件夹的路径,然后去获取改文件夹下所有的资源文件包括所有子目录下的所有文件并写回进file_list.txt。

具体的实现操作如下图:

代码很简单具体实现如下:

require "lfs"

local file_data = {}
add_file_data = function (str)
table.insert(file_data, str)
end output_file_list = function ()
local file_list = io.open("file_list.txt", "w+")
if file_list then
for _, file_path in ipairs(file_data) do
file_list:write(file_path)
file_list:write("\n")
end file_list:flush()
file_list:close()
end
end find_file_indir = function(path, r_table)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..'\\'..file
local attr = lfs.attributes (f)
assert(type(attr) == "table")
if attr.mode == "directory" then
find_file_indir(f, r_table)
else
table.insert(r_table, f)
end
end
end
end -- demo resource路径
SRC_RES_DIR = "L:\\demo\\" --copy资源扫描文件夹
find_include_file = function(folder_path)
local target_path = folder_path target_path = string.gsub(target_path, "\\", "/")
if string.match(target_path, "(.-)resource/+") then
target_path = string.gsub(target_path, "(.-)resource/", SRC_RES_DIR.."resource/")
end local input_table = {}
find_file_indir(target_path, input_table)
local i=
while input_table[i]~=nil do
local input_path = input_table[i]
input_path = string.gsub(input_path, SRC_RES_DIR.."(.-)%.(%w+)", function(route, suffix)
local _path = route.."."..suffix
return _path
end)
input_path = string.gsub(input_path, "\\", "/")
add_file_data(input_path)
i=i+
end
end local file = io.open("file_list.txt", "r")
if file then
local folder_path = file:read("*l")
while (folder_path) do
find_include_file(folder_path)
folder_path = file:read("*l")
end
file:close()
output_file_list()
end

注意:lfs.dll要放在lib文件夹下,但如果你想放其他地方的话,就需要加上它的默认索引环境,加上它的索引环境很简单在require的前面加上如下代码:package.cpath = "..\\你的.dll路径"

例如:package.cpath = "..\\res_copy\\bin\\sys_dll\\?.dll"

lua使用lfs.dll库进行文件操作的更多相关文章

  1. Lua中的一些库(1)

    [数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan……)所有的三角函数都使用弧度单位,可以用函数deg( ...

  2. go文件操作大全

    参考Go官方库的文件操作分散在多个包中,比如os.ioutil包,我本来想写一篇总结性的Go文件操作的文章,却发现已经有人2015年已经写了一篇这样的文章,写的非常好,所以我翻译成了中文,强烈推荐你阅 ...

  3. C/C++ 文件操作

    C/C++ 文件操作大概有以下几种 1.C的文件操作: 2.C++的文件操作: 3.WINAPI的文件操作: 4.BCB库的文件操作: 5.特殊文件的操作. 当然了,水题时最常用的当然还是: freo ...

  4. C++ builder的文件操作

    在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是:1.基于C的文件操作:2.基于C++的文件操作:3.基 ...

  5. 通过dll或def文件提取lib导入库文件

    很多时候第三方库或其他项目提供的库多数会以动态库的形式提供dll以及相应的lib导入库.头文件,不过也有的只是提供dll和头文件,或者也提供了def模块定义(用于导出函数)文件,此时若使用将不得不调用 ...

  6. golang调用c++的dll库文件

    最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...

  7. .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的.附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了 ...

  8. #Lua:Lua调用C++生成的DLL库

    Lua调用C++生成的DLL库 本文参考了某大佬的博客,写得十分详细,推荐!!! 需求: 在之前的求解器中添加了Lua库,使得程序可以在Lua脚本中实现自定义函数功能,考虑到未来可能需要与第三方程序库 ...

  9. Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()

    函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...

随机推荐

  1. 用UltraEdit比較两个文件

    在编写代码的过程中,经常碰到两个文件之间的逐行比較.特别是新代码与源码之间的文字比較,这里介绍用UltraEdit实现新代码与源码之间的比較方法. //源码:Bearing.mac FINISH /C ...

  2. Pulse-code modulation

    脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ...

  3. C# 取html <data>内容

    private void button1_Click(object sender, EventArgs e) { string strSource = GetHttpWebRequest(" ...

  4. YTU 1005: 渊子赛马

    1005: 渊子赛马 时间限制: 1000 Sec  内存限制: 64 MB 提交: 338  解决: 49 题目描述 赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为&qu ...

  5. 全局Timestamp管理器 检测js执行时间

    随手写了个小工具,主要为了测试不同混淆程度的javascript脚本的加载速度1. [代码]Timestamp.js (function() { if (typeof this.Timestamp = ...

  6. HDU - 4513 吉哥系列故事――完美队形II(manacher)

    1.找出一个最长的回文子串,要求中间的值最大,然后向两侧递减. 2.判断条件改为:Ma[i+Mp[i]]==Ma[i-Mp[i]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i ...

  7. 四:多线程--NSOperation简单介绍

    一.NSOperation简介 1.NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQu ...

  8. 同步 Github fork 分支

    /**************************************************************************** * 同步 Github fork 分支 * ...

  9. excel+requests管理测试用例接口自动化框架

    背景: 某项目有多个接口,之前使用的unittest框架来管理测试用例,将每个接口的用例封装成一个py文件,接口有数据或者字段变动后,需要去每个py文件中找出变动的接口测试用例,维护起来不方便,为了便 ...

  10. hdu2089(数位DP 递推形式)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...