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()->setScriptEngine(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;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;
}
#endifvoid startWatch(const char* path)
{
#ifdef WIN32static std::string s_path = path;//创建一个线程专门用于监控文件变化 HANDLE TrheadWatch=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WatchChanges,(void*)s_path.c_str(),0,NULL); CloseHandle(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);
windows下检測文件改变相关推荐
- Windows 下目录及文件向Linux同步
本文解决的是Windows 下目录及文件向Linux同步的问题,Windows向 Windows同步的请参考:http://www.idcfree.com/article-852-1.html 环境介 ...
- windows下批处理删除文件及注册表项
1.windows下批处理删除注册表项 假如我要清除WinRAR的历史记录,可以新建个批处理文件, 然后在里面加入如下文字: reg delete HKEY_CURRENT_USER/Software ...
- windows下的.DLL文件
DLL(Dynamic Link Library)文件为动态链接库文件,又称为"应用程序拓展",是软件文件类型.在windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...
- windows下批处理删除文件夹、删除文件、if exist用法
windows下批处理删除文件夹.删除文件.if exist用法 开发中用到Window批处理del.rd.if exist,总结用法便于后续使用. windows下批处理删除文件: * 使用del指 ...
- 在windows下看linux文件-Explore2fs(转)
在windows下看linux文件-Explore2fs(转)[@more@]Explore2fs 1.00 pre 6b 你曾经在Linux操作系统下载了很多文件,但是当你重新开启在Windows9 ...
- 系统运维系列 之在Windows下可以查看文件夹大小的工具TreeSize Free
给大家推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free. 下载链接: https://customers.jam-software.de/downloadTrial.php ...
- windows下修改hosts文件不需要重启也能生效。
windows下修改hosts文件不需要重启也能生效. 方法步骤: 一.单击Windows键,选择运行,输入CMD,回车. 二.在命令提示符中输入"ipconfig/displaydns&q ...
- windows下gvim打开文件显示乱码的解决
问题: 在windows中安装了gvim73,但是,使用gvim打开文件的时候,如果文件内容包含中文,那么,打开之后总是看到一堆乱码. 解决办法: 放狗搜了一下,发现这篇文章完美地解决了我的问题: h ...
- windows下将iso文件挂载到文件夹
linux这个操作很方便. windows下呢?windows有个mklink.junction等链接操作,我一般是用LinkShellExtension http://schinagl.priv.a ...
最新文章
- 习题:八数码难题(双向BFS)
- 雷神开机logo更改_雷神911 pro-钛空版开售,陪你过一个不一样的520
- MySQL Commons
- Python数据库使用-SQLite
- ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步
- 微软为何选择在 Github 上开源 .NET 核心?
- 配置nfs环境的一些命令
- 中国大数据人才薪酬报告
- Oracle10g在Win2008R2下因版本无法安装问题的解决
- 58java面试题_58到家,java开发实际面试题
- 设计模式在游戏中的应用--模板方法(七)
- ftl 页面使用java代码_在FTL文件中使用自定义的Java方法
- 2020届校园招聘360笔试题
- 一步控制台编译java_在控制台运行一个 Java 程序 Test . class ,使用的命令正确的是( )_学小易找答案...
- 怎么给手机照片添加文字?没想到方法这么容易,1分钟就能学会
- 蓝牙耳机通话降噪哪个效果好?目前降噪效果最好的耳机推荐
- Pikachu漏洞练习平台----验证码绕过(on server) 的深层次理解
- 联想win10系统忘记开机密码解决方式
- 快速搭建小程序,实现线上引流获客
- 大数据导出Excel导致内存溢出的解决方案