windows下检测文件改变

更新时间:2023-07-01 19:51:24 阅读: 评论:0

windows下检测⽂件改变
这个主要是应⽤在我⾥提到的脚本热加载功能。主要实现的功能检测⽂件夹内⽂件的变化(改变、新增、删除、重命名),当发现改变的时候通知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()
{
int time = GetTickCount();
if (time - lastChangeTime <= 1000) {
/
/ 忽略短时间内的重新加载请求
return;
}
Director::getInstance()->getScheduler()->performFunctionInCocosThread([](){
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->tScriptEngine(engine);
lua_State* L = engine->getLuaStack()->getLuaState();
lua_getglobal(L, "reloadGame");
lua_call(L, 0, 0);
});
}
DWORD WINAPI WatchChanges(LPVOID lpParameter)//返回版本信息
包皮发红
{
wchar_t watchDirectory[512] = {0};
生命的激情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) {
DWORD ERROR_DIR=GetLastError();
CCLOG("Open Directory Error");
}
BOOL watch_state;
while (TRUE)
{
char buffer[1024] = {0};
DWORD bytesReturned = 0;
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) {
return -1;
}
if(watch_state != 0) {
DWORD length=WideCharToMultiByte(0,0,notify->FileName,-1,NULL,0,NULL,NULL);
char fileName[256] = {0};
WideCharToMultiByte(0,0,notify->FileName,-1,fileName,length,NULL,NULL);英国预科
//这⾥主要就是检测返回的信息,需要注意FILE_NOTIFY_INFORMATION结构体的定义,以便正确调⽤返回信息
if (notify->Action==FILE_ACTION_ADDED) {
CCLOG("file add: %s", fileName);
大丈夫不得出头// sublime 修改⽂件是新增⼀个临时⽂件,这个是兼容措施
reloadGame();
}
if (notify->Action==FILE_ACTION_REMOVED) {
CCLOG("file delete: %s", fileName);
}
if (notify->Action==FILE_ACTION_MODIFIED) {
CCLOG("file changed: %s", fileName);
reloadGame();
}
//对于下⾯两种情况,Action本⾝也是⽂件名(可能是old_name也可能是new_name)
if (notify->Action==FILE_ACTION_RENAMED_OLD_NAME) {
CCLOG("file rename old name: %s", fileName);
}
if (notify->Action==FILE_ACTION_RENAMED_NEW_NAME) {
CCLOG("file rename new name: %s", fileName);
}
}
Sleep(500);
}
今年寒潮大幅超标return 0;
}
#endif
void startWatch(const char* path)
{
#ifdef WIN32
static std::string s_path = path;
//创建⼀个线程专门⽤于监控⽂件变化
HANDLE TrheadWatch=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WatchChanges,(void*)s_path.c_str(),0,NULL);  CloHandle(TrheadWatch);
#endif
}
注册给lua的实现:
#include "lua_cutil.h"
//#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#include <string>
#include "FileWatcher.h"
#include <lua.h>
#include <lauxlib.h>
int lua_cutil_watch(lua_State *pL)
{
std::string path = luaL_checkstring(pL, 1);
startWatch(path.c_str());
return 0;
}
int luaopen_cutil(lua_State *pL)
{
// 注册lua函数
luaL_Reg reg [] = {
君士坦丁十一世{"watch",    lua_cutil_watch},
{NULL, NULL}
};
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);

本文发布于:2023-07-01 19:51:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1063559.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:加载   改变   需要   新增   脚本   线程
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图