在项目开发中,为了提高开发效率往往需要开发一些辅助工具。最近在公司用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. 如何使用jQuery向asp.net Mvc传递复杂json数据

    jQuery提供的ajax方法能很方便的实现客户端与服务器的异步交互,在asp.net mvc 框架使用jQuery能很方便地异步获取提交数据,给用户提供更好的体验! 调用jQuery的ajax方法时 ...

  2. java8--IO(java疯狂讲义3复习笔记)

    产生文件 File file = new File("abc.txt"); if(!file.exists()){ System.out.println(file.exists() ...

  3. 可以声明接口,但不可以new接口

    接口是一种特殊的抽象类,它包含常量和方法的声明,但没有方法的实现:可以把接口看成是一种特殊的抽象类: 接口实质上是一种规范,它关心的是"做什么",不关心"怎样做" ...

  4. PR 修改保存的增强 ME_UPDATE_REQUISITION

    FUNCTION me_update_requisition."""""""""""&qu ...

  5. POJ3020 Antenna Placement —— 最大匹配 or 最小边覆盖

    题目链接:https://vjudge.net/problem/POJ-3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K ...

  6. mac系统下配置aapt环境变量

    在当前用户目录下新建.bash_profile文件,执行以下命令: vi .bash_profile 然后保存,输入命令  :wq 最后使命令生效,执行命令 source .bash_profile

  7. CF上的3道小题(2)

    CF上的3道小题(2) T1:CF630K Indivisibility 题意:给出一个数n,求1到n的数中不能被2到9中任意一个数整除的数. 分析:容斥一下,没了. 代码: #include < ...

  8. [Codeforces 545E] Paths and Trees

    [题目链接] https://codeforces.com/contest/545/problem/E [算法] 首先求 u 到所有结点的最短路 记录每个节点最短路径上的最后一条边         答 ...

  9. CGAN 论文笔记

    <Conditional Generative Adversarial Nets>: 发表于2014 computer Science.作者提出了最简单的条件控制GAN模型,在D和G两个模 ...

  10. 【189】◀▶ PowerShell 系统学习

    参考网站如下: PowerShell 中文博客      PowerShell 博客——叹为观止 Mater-PowerShell      通过 PowerShell 编写脚本      Power ...