在项目开发中,为了提高开发效率往往需要开发一些辅助工具。最近在公司用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. Linux如何查看进程等常用命令

    1.查进程    ps命令查找与进程相关的PID号:    ps a 显示现行终端机下的所有程序,包括其他用户的程序.    ps -A 显示所有程序.    ps c 列出程序时,显示每个程序真正的 ...

  2. 在win10 docker启动的centos容器中安装nginx

    我是在win10机器上搭建了一个docker,在docker启动了centos容器,在centos中安装nginx. 安装配置docker 直接在官网下载docker for windows:http ...

  3. leetcode 316. Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  4. git lfs

    https://git-lfs.github.com/ 1.从这个网址下载git-lfs-windows-amd64-1.1.0.exe,运行这个安装包 2.然后打开git bash 输入git lf ...

  5. YTU 2439: C++习题 复数类--重载运算符+

    2439: C++习题 复数类--重载运算符+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1022  解决: 669 题目描述 定义一个复数类Complex,重载运算符"+ ...

  6. xcode 8.1 (8B62)真机调试配置

    1.点击菜单栏中的Xcode->Preferences->Accounts,如图: 点击上图左下角中的“+”号,登陆一个Apple id(前提已经有了一个apple id账号), 2.然后 ...

  7. poj-1655 Balancing Act(树的重心+树形dp)

    题目链接: Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11845   Accepted: 4 ...

  8. bzoj4289 PA2012 Tax——点边转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...

  9. appium学习【三】:截图时,图片命令中包含当前的函数名,以区分错误是在哪个函数报的

    import sys funcName = sys._getframe().f_back.f_code.co_name #获取调用函数名 print sys._getframe().f_code.co ...

  10. STM32F4 LTDC学习

    很久没有写东西了,也很久没看文档了吼吼,觉得有点无聊,找来F4看看,主要看F429.督促自己多看多记录. 首先配置同步时序先看参考手册 下面看一个实际例子,一块439的开发板 设置: LTDC_Ini ...