在项目开发中,为了提高开发效率往往需要开发一些辅助工具。最近在公司用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. centos7 配置虚拟交换机(物理交换机truckport设置)(使用brctl)

    感谢朋友支持本博客.欢迎共同探讨交流,因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  2. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM(转载)

    http://www.cnblogs.com/indream/p/3602348.html 刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code ...

  3. 使用jdbc对mysql进行增删改查

    建立数据库和数据表 CREATE DATABASE `mysqlTest` DEFAULT CHARACTER SET utf8; CREATE TABLE `test` ( `id` ) NOT N ...

  4. GrideView(三)---编辑功能实现

    GrideView(三)---编辑 法一.(优势:操作数据更加灵活:劣势: 书写较多代码,开发效率低) 通过编辑列---添加超链接(HyperlinkField)字段 ,来跳转页面实现编辑操作: 步骤 ...

  5. linux input子系统 — TP A/B(Slot)协议【转】

    本文转载自:http://blog.csdn.net/u012719256/article/details/53609906 将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围 ...

  6. centos7下比特币源码编译安装

    今天我们介绍比特币的源码安装过程,是利用编译安装的 首先安装依赖 1 yum install -y boost-devel qt-devel protobuf-devel qrencode-devel ...

  7. python库学习笔记——爬虫常用的BeautifulSoup的介绍

    1. 开启Beautiful Soup 之旅 在这里先分享官方文档链接,不过内容是有些多,也不够条理,在此本文章做一下整理方便大家参考. 官方文档 2. 创建 Beautiful Soup 对象 首先 ...

  8. LOJ114_k 大异或和_线性基

    LOJ114_k 大异或和_线性基 先一个一个插入到线性基中,然后高斯消元. 求第K小就是对K的每一位是1的都用对应的线性基的一行异或起来即可. 但是线性基不包含0的情况,因此不能确定能否组成0,需要 ...

  9. Java ServerSocket的服务端代码介绍

    转自:http://developer.51cto.com/art/201003/190007.htm 所谓Java ServerSocket通常也称作"套接字",有不少的时候需要 ...

  10. pascal倒序输出

    program Project6; {$APPTYPE CONSOLE} uses SysUtils; var a,b,c,d:integer; begin { TODO -oUser -cConso ...