Cocos2d-x 文件工具類(lèi)

  • 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燃异、xpcalldebug继蜡,若需在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

requireLuaLoadChunksFromZIP 的區(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中查找。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暂刘,一起剝皮案震驚了整個(gè)濱河市饺谬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谣拣,老刑警劉巖募寨,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件族展,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拔鹰,警方通過(guò)查閱死者的電腦和手機(jī)仪缸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)列肢,“玉大人恰画,你說(shuō)我怎么就攤上這事±椋” “怎么了锣尉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)决采。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坟奥,這世上最難降的妖魔是什么树瞭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爱谁,結(jié)果婚禮上晒喷,老公的妹妹穿的比我還像新娘。我一直安慰自己访敌,他們只是感情好凉敲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著寺旺,像睡著了一般爷抓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阻塑,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天蓝撇,我揣著相機(jī)與錄音,去河邊找鬼陈莽。 笑死渤昌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的走搁。 我是一名探鬼主播独柑,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼私植!你這毒婦竟也來(lái)了忌栅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兵琳,失蹤者是張志新(化名)和其女友劉穎狂秘,沒(méi)想到半個(gè)月后骇径,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡者春,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年破衔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钱烟。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晰筛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拴袭,到底是詐尸還是另有隱情读第,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布拥刻,位于F島的核電站怜瞒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏般哼。R本人自食惡果不足惜吴汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒸眠。 院中可真熱鬧漾橙,春花似錦、人聲如沸楞卡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒋腮。三九已至淘捡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徽惋,已是汗流浹背案淋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留险绘,地道東北人踢京。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宦棺,于是被迫代替她去往敵國(guó)和親瓣距。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容