windows下檢測檔案改變

2021-09-07 11:32:43 字數 3005 閱讀 1006

這個主要是應用在我前一篇部落格裡提到的指令碼熱載入功能。

主要實現的功能檢測目錄內檔案的變化(改變、新增、刪除、重新命名),當發現改變的時候通知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系統也是檔名大小寫不敏感的 放到實際裝置上執行可能各種崩潰。其中十有 是配置檔名和實...