vc++ 监控指定路径下文件变化实现代码

 更新时间:2019年04月07日 22:06:46   投稿:mdxy-dxy  
这篇文章主要介绍了vc++ 监控指定路径下文件变化实现代码,需要的朋友可以参考下

参考MSDN文档

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw

https://docs.microsoft.com/zh-cn/windows/desktop/api/winnt/ns-winnt-_file_notify_information

具体看代码

# include < iostream >
 # include < windows.h >
 # include < process.h >
 # include < tchar.h >
 # include < string >
using namespace std;
typedef void( * CHANGESCALLBACK)(const std::wstring strFileName);
/*
@ 监控指定目录下文件变化
@ strDirPath 需要监控的目录
@ dwChangesType 需要监控文件变化方式
@ onCallBack 变化后的回调处理函数
 */
void CheckFilesChanges(const std::wstring strDirPath, DWORD dwChangesType, CHANGESCALLBACK onCallBack);
void PrintMsg(const std::wstring strFileName) {
  wprintf_s(L "new add File:\t %s\r\n", strFileName.c_str());
}
void CheckFilesChanges(const std::wstring strDirPath, DWORD dwChangesType, CHANGESCALLBACK onCallBack) {
  if (strDirPath.empty() || !onCallBack)
    return;
  HANDLE hDir = INVALID_HANDLE_VALUE;
  BYTE lpBuffer[1024];
  ZeroMemory(lpBuffer, 1024);
  DWORD cbBytes = NULL;
  BOOL isOk = FALSE;
  FILE_NOTIFY_INFORMATION * pnotify = (FILE_NOTIFY_INFORMATION * )lpBuffer;
  FILE_NOTIFY_INFORMATION * tmp;
  ZeroMemory( & lpBuffer, sizeof(FILE_NOTIFY_INFORMATION));
  hDir = CreateFile(strDirPath.c_str(), FILE_LIST_DIRECTORY,
      FILE_SHARE_READ |
      FILE_SHARE_WRITE |
      FILE_SHARE_DELETE, NULL,
      OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS |
      FILE_FLAG_OVERLAPPED, NULL);
  if (INVALID_HANDLE_VALUE == hDir)
    return;
  while (true) {
    isOk = ReadDirectoryChangesW(hDir, & lpBuffer,
        sizeof(lpBuffer),
        TRUE,
        FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
         & cbBytes,
        NULL,
        NULL);
    if (isOk) {
      tmp = pnotify;
      PWSTR fileName = nullptr;
      std::wstring strFileName;
      if (tmp->FileNameLength) {
        DWORD dwLength = tmp->FileNameLength + 1;
        fileName = new wchar_t[dwLength];
        if (fileName) {
          memset(fileName, 0, dwLength * 2);
          memcpy(fileName, tmp->FileName, dwLength * 2);
          strFileName = fileName;
        }
        if (fileName)
          delete []fileName;
      }
      if (tmp->Action == dwChangesType) {
        onCallBack(strFileName);
      }
      ZeroMemory(tmp, 1024);
      /*switch (tmp->Action){
      case FILE_ACTION_ADDED: //当前目录新增文件{
      onCallBack(strFileName);
      }break;
 
      case FILE_ACTION_REMOVED:  //该文件已从目录中删除{
      onCallBack(strFileName);
      }
      break;
      case FILE_ACTION_MODIFIED: //该文件已被修改。也可以是时间戳或属性的更改{
      onCallBack(strFileName);
      }
      break;
      case FILE_ACTION_RENAMED_OLD_NAME: //该文件已重命名,这是旧名称。{
      onCallBack(strFileName);
      }
      break;
      case FILE_ACTION_RENAMED_NEW_NAME: //该文件已重命名,这是新名称。{
      onCallBack(strFileName);
      }
      break;
      default:
      break;
      }*/
    }
  }
  CloseHandle(hDir);
}
unsigned int CALLBACK ThreadProc(void * arg) {
  CheckFilesChanges(_T("E:\\GoCode"), FILE_ACTION_ADDED, PrintMsg);
  return 0;
}
int main(int argc, char * argv[]) {
  HANDLE hThread = NULL;
  hThread = (HANDLE)::_beginthreadex(nullptr, NULL, ThreadProc, NULL, NULL, NULL);
  system("pause");
  return 0;
}

好了这篇文章就介绍到这了,需要的朋友可以参考一下。

相关文章

  • C语言的字符串函数,内存函数笔记详解

    C语言的字符串函数,内存函数笔记详解

    这篇文章主要给大家介绍了关于C语言字符串/内存的相关函数,文中通过示例代码总结的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-09-09
  • C++ namespace命名空间解析

    C++ namespace命名空间解析

    考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如它们生活在不同的区域或者兴趣爱好什么的,在C++程序中也会遇到同样的情况,所以命名空间就此产生
    2021-11-11
  • 纯C语言:递归最大数源码分享

    纯C语言:递归最大数源码分享

    这篇文章主要介绍了纯C语言:递归最大数源码,需要的朋友可以参考一下
    2014-01-01
  • C语言实现AT指令ASCII码的拼接处理流程

    C语言实现AT指令ASCII码的拼接处理流程

    今天小编就为大家分享一篇关于C语言实现AT指令ASCII码的拼接处理流程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++使用sort对容器排序的实现

    C++使用sort对容器排序的实现

    C++ STL 标准库中的sort()函数专门用来对容器或普通数组中指定范围内的元素进行排序,本文就详细的介绍一下怎么实现,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C++ 中引用和指针的关系实例详解

    C++ 中引用和指针的关系实例详解

    这篇文章主要介绍了C++ 中引用和指针的关系实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C指针原理教程之AT&T汇编

    C指针原理教程之AT&T汇编

    AT&T 汇编是一种和intel汇编在语法上完全不同的汇编语言,为避免混淆intel语法,本文只介绍AT&T汇编,AT&T的第一个特点就是每个寄存器名前必须加‘%’,立即数前必须加‘$’
    2019-02-02
  • C语言绘制余弦、正弦曲线

    C语言绘制余弦、正弦曲线

    这篇文章主要为大家详细介绍了C语言绘制余弦、正弦曲线的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Qt基础开发之QString与QByteArray详细用法与区别及QString QByteArray互转

    Qt基础开发之QString与QByteArray详细用法与区别及QString QByteArray互转

    这篇文章主要介绍了Qt基础开发之QString与QByteArray详细用法与区别及QString QByteArray互转,需要的朋友可以参考下
    2020-03-03
  • C语言实现弹跳小球

    C语言实现弹跳小球

    这篇文章主要为大家详细介绍了C语言实现弹跳小球,设置了小球分数及过关难度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论