这个主要是应用在我前一篇博客里提到的脚本热载入功能。

主要实现的功能检測目录内文件的变化(改变、新增、删除、重命名),当发现改变的时候通知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下检測文件改变相关推荐

  1. Windows 下目录及文件向Linux同步

    本文解决的是Windows 下目录及文件向Linux同步的问题,Windows向 Windows同步的请参考:http://www.idcfree.com/article-852-1.html 环境介 ...

  2. windows下批处理删除文件及注册表项

    1.windows下批处理删除注册表项 假如我要清除WinRAR的历史记录,可以新建个批处理文件, 然后在里面加入如下文字: reg delete HKEY_CURRENT_USER/Software ...

  3. windows下的.DLL文件

    DLL(Dynamic Link Library)文件为动态链接库文件,又称为"应用程序拓展",是软件文件类型.在windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...

  4. windows下批处理删除文件夹、删除文件、if exist用法

    windows下批处理删除文件夹.删除文件.if exist用法 开发中用到Window批处理del.rd.if exist,总结用法便于后续使用. windows下批处理删除文件: * 使用del指 ...

  5. 在windows下看linux文件-Explore2fs(转)

    在windows下看linux文件-Explore2fs(转)[@more@]Explore2fs 1.00 pre 6b 你曾经在Linux操作系统下载了很多文件,但是当你重新开启在Windows9 ...

  6. 系统运维系列 之在Windows下可以查看文件夹大小的工具TreeSize Free

    给大家推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free. 下载链接: https://customers.jam-software.de/downloadTrial.php ...

  7. windows下修改hosts文件不需要重启也能生效。

    windows下修改hosts文件不需要重启也能生效. 方法步骤: 一.单击Windows键,选择运行,输入CMD,回车. 二.在命令提示符中输入"ipconfig/displaydns&q ...

  8. windows下gvim打开文件显示乱码的解决

    问题: 在windows中安装了gvim73,但是,使用gvim打开文件的时候,如果文件内容包含中文,那么,打开之后总是看到一堆乱码. 解决办法: 放狗搜了一下,发现这篇文章完美地解决了我的问题: h ...

  9. windows下将iso文件挂载到文件夹

    linux这个操作很方便. windows下呢?windows有个mklink.junction等链接操作,我一般是用LinkShellExtension http://schinagl.priv.a ...

最新文章

  1. 习题:八数码难题(双向BFS)
  2. 雷神开机logo更改_雷神911 pro-钛空版开售,陪你过一个不一样的520
  3. MySQL Commons
  4. Python数据库使用-SQLite
  5. ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步
  6. 微软为何选择在 Github 上开源 .NET 核心?
  7. 配置nfs环境的一些命令
  8. 中国大数据人才薪酬报告
  9. Oracle10g在Win2008R2下因版本无法安装问题的解决
  10. 58java面试题_58到家,java开发实际面试题
  11. 设计模式在游戏中的应用--模板方法(七)
  12. ftl 页面使用java代码_在FTL文件中使用自定义的Java方法
  13. 2020届校园招聘360笔试题
  14. 一步控制台编译java_在控制台运行一个 Java 程序 Test . class ,使用的命令正确的是( )_学小易找答案...
  15. 怎么给手机照片添加文字?没想到方法这么容易,1分钟就能学会
  16. 蓝牙耳机通话降噪哪个效果好?目前降噪效果最好的耳机推荐
  17. Pikachu漏洞练习平台----验证码绕过(on server) 的深层次理解
  18. 联想win10系统忘记开机密码解决方式
  19. 快速搭建小程序,实现线上引流获客
  20. 大数据导出Excel导致内存溢出的解决方案

热门文章

  1. 诺顿无法启动扫描,扫描引擎返回错误0x20000058错误
  2. 使用IConfigurationSectionHandler在web.config中增加自定义配置
  3. cmake常用语法参考
  4. 区块链开发公司开拓新用途 区块链对网络安全的作用
  5. 双向重定向指令 tee
  6. Redisbook学习笔记(3)数据类型之列表
  7. 定义和使用结构体变量
  8. 20160130001 冯仑风马牛
  9. Mac入门——快捷键
  10. OSPF NSSA 默认路由的问题