這個主要是應用在我前一篇部落格裡提到的指令碼熱載入功能。
主要實現的功能檢測目錄內檔案的變化(改變、新增、刪除、重新命名),當發現改變的時候通知lua又一次載入指令碼。基本上就是乙個windows api的使用。實際應用中會有一些細節須要注意,比方我習慣使用sublime text編輯。而sublime text儲存檔案不是直接改變檔案內容,而是新增乙個檔案。這些細節情況須要實際使用中微調。
**例如以下:
#include "filewatcher.h"
#include "cocos2d.h"
#include "ccluaengine.h"
using namespace cocos2d;
#ifdef win32
// 函式: watchchanges(lpvoid lpparameter)
//
// 目的: 監控資料夾的程式
//
// 凝視:主函式建立執行緒時制定了這個函式的入口
// 屆時該子程式將自己主動啟動執行。
// 備註:由於**不全,看以下的**時,主要參考紅色的字型部分
static int lastchangetime = 0;
void reloadgame()
director::getinstance()->getscheduler()->performfunctionincocosthread(());
}dword winapi watchchanges(lpvoid lpparameter)//返回版本號資訊
; multibytetowidechar(cp_acp, 0, (char*)lpparameter, strlen((char*)lpparameter), watchdirectory, sizeof(watchdirectory) / sizeof(wchar_t));
//建立乙個資料夾控制代碼
handle handle_directory=createfile(watchdirectory,
file_list_directory,
file_share_read | file_share_write | file_share_delete,
null,
open_existing,
file_flag_backup_semantics,
null);
if(handle_directory==invalid_handle_value)
bool watch_state;
while (true)
; dword bytesreturned = 0;
file_notify_information* notify = (file_notify_information*)buffer;
watch_state=readdirectorychangesw(handle_directory, (lpvoid)buffer,
sizeof(buffer), true,
file_notify_change_file_name|file_notify_change_dir_name|file_notify_change_last_write,
(lpdword)&bytesreturned, null, null);
int err = getlasterror();
if (err == error_invalid_function || err == error_notify_enum_dir)
if(watch_state != 0) ;
widechartomultibyte(0,0,notify->filename,-1,filename,length,null,null);
//這裡主要就是檢測返回的資訊,須要注意file_notify_information結構體的定義,以便正確呼叫返回資訊
if (notify->action==file_action_added)
if (notify->action==file_action_removed)
if (notify->action==file_action_modified)
//對於以下兩種情況。action本身也是檔名稱(可能是old_name也可能是new_name)
if (notify->action==file_action_renamed_old_name)
if (notify->action==file_action_renamed_new_name)
} sleep(500);
} return 0;
}#endif
void startwatch(const char* path)
註冊給lua的實現:
#include "lua_cutil.h"
//#include #include #include #include #include #include "filewatcher.h"
#include #include int lua_cutil_watch(lua_state *pl)
int luaopen_cutil(lua_state *pl),
}; lual_register(pl, "cutil", reg);
return 1;
}
lua中呼叫的方式:
local mainpath = cc.fileutils:getinstance():fullpathforfilename('main.lua');
mainpath = string.sub(mainpath, 1, string.find(mainpath, 'main%.lua') - 1);
print(mainpath);
cutil.watch(mainpath);
Windows下如何改變目錄
cd命令是改變子目錄的命令。格式 cd 路徑 值得明確的是 cd命令只能進入當前碟符中的資料夾,改變操作的根目錄 改變操作碟符 則不需用cd。例如你當前是在c 盤下,要到d 盤,只需鍵入d 回車就行了。例項一 現在的位置是c盤,如果需要進入c盤的windows目錄,則輸入命令 cd windows,...
Windows下記憶體洩漏檢測方法
windows下記憶體洩漏檢測方法一 1 在主程式的cpp檔案裡加上以下三行,順序一定不能顛倒 define crtdbg map alloc include include 2 在程式退出的時候加上 crtdumpmemoryleaks 如果程式有多個退出的地方,則多個地方要加 crtdumpme...
windows下如何檢測檔名大小寫不匹配
ios和android 還有linux 都是檔名大小寫敏感的,windows是大小寫不敏感的。這樣遊戲開發的時候就會出現這樣的問題,windows下測試正常的遊戲 包括mac下的ios模擬器執行正常的遊戲,因為mac系統也是檔名大小寫不敏感的 放到實際裝置上執行可能各種崩潰。其中十有 是配置檔名和實...