- Cocos2dx 3.0+
FileUtils 單例對(duì)象
FileUtils
是一個(gè)單例類(lèi),可通過(guò)getInstance()
獲取單例對(duì)象上遥。
1. 獲取文件工具類(lèi)單例對(duì)象
-- 獲取共享實(shí)例的類(lèi)
static FileUtils* getInstance()
-- 示例:quick-cocos2dx
local fileUtils = cc.FileUtils:getInstance()
2. 釋放單例對(duì)象資源
static void destroyInstance()
3. 清理文件查找緩存
virtual void purgeCachedEntries()
文件讀取
1. 讀取文件內(nèi)容
-- 讀取文件內(nèi)容并返回?cái)?shù)據(jù)
virtual Data getDataFromFile(const std::string& filename)
virtual std::string getStringFromFile(const std::string& filename)
-- 讀取文件內(nèi)容并返回?cái)?shù)據(jù)內(nèi)容搏屑,data.getBytes() 獲取數(shù)據(jù)。
-- 示例
local fileUtil = cc.FileUtil:getInstance()
local fileContent = fileUtil:getStringFromFile('text.txt')
print(fileContent)
-- 讀取zip中資源文件內(nèi)容
-- [in] zipFilePath zip文件路徑即相對(duì)zip的文件路徑
-- [out] size 若文件讀取成功則獲取數(shù)據(jù)的大小粉楚,否則為0.
-- 讀取成功返回?cái)?shù)據(jù)指針,否則返回nullptr亮垫。
virtual unsigned char* getFileFromZip(
const std::string& zipFilePath,
const std::string& filename,
ssize_t *size
)
-- fullPathForFilename
-- 訪(fǎng)問(wèn)res目錄模软,若文件存在在res目錄下,則需添加搜索目錄饮潦。
local file = cc.FileUtils:getInstance():fullPathForFilename('test.txt')
-- isFileExist(arg)
-- 判斷文件是否存在
local isExist = cc.FileUtils:getInstance():isExist('text.txt')
-- getWritablePath
-- 可寫(xiě)入目錄
local writablePath = cc.FileUtils:getInstance():getWritablePath()
-- 判斷文件是否存在
local function fileExists(file)
local fileUtils = cc.FileUtils:getInstance()
local isExist = fileUtils:isFileExist(file)
if isExists==true then
local filename = fileUtils:fullPathForFilename(file)
-- return filename
print('exists')
else
-- return false
print('fail')
end
end
2. 文件查找
-- 設(shè)置文件查找路徑
當(dāng)文件加載失敗是否彈出messagebox
-- 當(dāng)文件加載失敗是否淡出消息
void setPopupNotify(bool notify)
-- 示例:quick-cocos2dx
local fileUtils = cc.FileUtils:getInstance()
fileUtils:setPopupNotify(false)
異常處理
Lua中異常處理分為pcall
燃异、xpcall
、debug
继蜡,若需在Lua中處理錯(cuò)誤回俐,必須使用 pcall(protected call)
來(lái)包裝所需執(zhí)行的代碼。
1. pcall
if pcall(fname, args...) then
return true
else
return false
end
pcall
接收一個(gè)函數(shù)和所要傳遞給函數(shù)的參數(shù)稀并,并執(zhí)行函數(shù)仅颇,函數(shù)執(zhí)行有錯(cuò)誤則返回true
,無(wú)錯(cuò)誤則返回false
碘举。
pcall
以一種保護(hù)模式來(lái)調(diào)用第一個(gè)參數(shù)忘瓦,因此pcall可以捕獲函數(shù)執(zhí)行中的任何錯(cuò)誤。
2. xpcall
通常在錯(cuò)誤發(fā)生時(shí)引颈,希望獲得更多的調(diào)試信息耕皮,而不只是發(fā)生錯(cuò)誤的位置。pcall
返回時(shí)已經(jīng)銷(xiāo)毀了調(diào)用棧的部分內(nèi)容蝙场。
Lua提供了xpcall
凌停,接收第二個(gè)參數(shù),即一個(gè)錯(cuò)誤處理函數(shù)售滤。當(dāng)錯(cuò)誤發(fā)生時(shí)罚拟,Lua會(huì)在調(diào)用棧展看 unwind
前調(diào)用錯(cuò)誤處理函數(shù),于是可以在xpcall
中使用debug
庫(kù)來(lái)獲取關(guān)于錯(cuò)誤的額外信息趴泌。
3. debug
debug
庫(kù)提供了兩個(gè)通用的錯(cuò)誤處理函數(shù):
-
debug.debug
提供一個(gè)Lua提示符舟舒,讓用戶(hù)來(lái)獲取錯(cuò)誤的原因。 -
debug.traceback
根據(jù)調(diào)用棧來(lái)構(gòu)建一個(gè)可擴(kuò)展的錯(cuò)誤信息
加載模塊
1. require(modName)
require
會(huì)加載給定的模塊嗜憔,首先檢查表package.loaded
來(lái)判定模塊是否已經(jīng)存在秃励。若存在則加載返回package.loaded[modName]
所存儲(chǔ)的值,否則嘗試為模塊找到一個(gè)加載器吉捶。
要找到一個(gè)加載器夺鲜,require
首先查詢(xún)package.preload[modName]
皆尔,若有值且是一個(gè)函數(shù)則斷定就是一個(gè)加載。若沒(méi)有值require
使用package.path
中存儲(chǔ)的路徑查找一個(gè)Lua的加載器币励。若該查找也失敗慷蠕,則使用package.cpath
中存儲(chǔ)的路徑查找一個(gè)C語(yǔ)言加載,若仍然失敗則嘗試使用all-in-one
加載器食呻。
當(dāng)加載一個(gè)C語(yǔ)言庫(kù)時(shí)流炕,require
首先使用動(dòng)態(tài)鏈接工具將應(yīng)用程序與庫(kù)連接起來(lái),之后嘗試找到該庫(kù)中的C函數(shù)仅胞,該函數(shù)要被當(dāng)做加載器使用每辟。這個(gè)C函數(shù)的名字是字符串luaopen_
連接著復(fù)制的模塊名。此外干旧,若模塊名稱(chēng)中函數(shù)連字符-
渠欺,則第一個(gè)連字符的前綴包括連字符都會(huì)被移除。
若require
既沒(méi)有為模塊查找到一個(gè)Lua庫(kù)椎眯,也沒(méi)有為模塊找到一個(gè)C庫(kù)挠将,它將調(diào)用all-in-one
加載器。該加載器為給定模塊的根名稱(chēng)编整,查找C路徑并找到對(duì)應(yīng)的庫(kù)舔稀。
一旦找到一個(gè)加載器,require
會(huì)使用單個(gè)參數(shù)modName
調(diào)用加載器闹击。若加載器返回任何值镶蹋,則require
會(huì)將其賦值給package.loaded[modName]
。若加載器無(wú)返回值且沒(méi)有給package.loaded[modName]
賦與任何值赏半,則require
為該條目賦值為true
贺归。無(wú)論如何,require
返回package.loaded[modName]
的最終值断箫。
若加載或運(yùn)行模塊有任何錯(cuò)誤或不能為模塊尋找一個(gè)加載器拂酣,則require
會(huì)發(fā)出一個(gè)錯(cuò)誤信號(hào)。
2. LuaLoadChunksFromZIP
require
和 LuaLoadChunksFromZIP
的區(qū)別:
-
require
加載包的順序是package.loaded
仲义、package.preload
... -
LuaLoadChunksFromZIP
會(huì)解壓包并加載數(shù)據(jù)到內(nèi)存中婶熬,可在package.preload
中查看使用LuaLoadChunksFromZIP
加載的包package。
若加載到內(nèi)存中的包埃撵,使用require
就只能是完全能對(duì)應(yīng)的包名赵颅,但若是文件的話(huà)可以在package.path
中查找。