在項目開發中,爲了提升開發效率每每須要開發一些輔助工具。最近在公司用lua幫拓展了一個資源掃描的工具,這個工具的功能就是從原始demo下指定目標資源文件,對該文件進行讀取並篩選過濾一遍而後拷貝到最終demo對應的文件目錄下。工具
咱們知道要讀取一個文件必須指定對應路徑,而咱們在一個大型遊戲軟件開發中每一個人所提交上去的資源都是在不一樣文件目錄下的。因此原先的作法就是手動去把路徑一個一個貼出來,整合記錄到一個文本中,掃資源的時候先去該文本一行一行的拿路徑,ui
根據路徑獲取目標文件並進行篩選拷貝操做等等。若是一個目錄下的資源文件很少還好,要是策劃批量上傳了一堆特效文件或者貼圖的話就苦逼了。qc要一個一個的去貼出路徑來,這樣的話工做效率就低下了,主要是文件特別多還會出現漏交的時候。lua
一旦漏交就至關於隱匿了一個巨大的炸彈隨時會爆炸使遊戲崩掉。因此爲了解決這個問題,使用lua的lfs.dll幫了大忙(咱們的資源掃描工具是用lua弄的)。spa
改進的想法是在記錄路徑的file_list.txt文件直接貼目標文件夾的路徑,而後去獲取改文件夾下全部的資源文件包括全部子目錄下的全部文件並寫回進file_list.txt。code
具體的實現操做以下圖:blog
代碼很簡單具體實現以下:索引
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=1 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+1 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"ip