参考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;
}

  

vc++ 监控指定路径下文件变化的更多相关文章

  1. java监控指定路径下文件及文件夹变化

    之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...

  2. C#监控指定目录的文件变化的代码

    如下的资料是关于C#监控指定目录的文件变化的代码. FileSystemWatcher watcher = new FileSystemWatcher();watcher.Path = @" ...

  3. bat文件重命名指定路径下文件

    ren "E:\产品\Planning\C1-Planning11\C1-Planning11\target\123" 456 此命令是将文件123重命名为456 注意:456是文 ...

  4. [Erlang27]如何监控指定目录下的*.beam文件,如果有改动就更新到指定的节点?

    在Erlang In Anger第二章中讲到使用rebar来创建一个Erlang项目(Application或Project) 但美中不足的只是给出了指引,但没有给出详细的步骤. 下面我们就使用reb ...

  5. 初识TypeScript:查找指定路径下的文件按类型生成json

    如果开发过node.js的话应该对js(javascript)非常熟悉,TypeScript(以下简称ts)是js的超集. 下面是ts的官网: https://www.tslang.cn/ 1.环境配 ...

  6. C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名

    1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...

  7. java 压缩文件 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件

    /** * 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件 * * @param files * 文件数组 * @param strZipName * 压缩文件路径及文件名 * @thr ...

  8. Java递归输出指定路径下所有文件及文件夹

    package a.ab; import java.io.File; import java.io.IOException; public class AE { public static void ...

  9. python之实现循环查看指定路径下的所有文件---os.walk

    循环查看指定路径下的所有文件.文件夹,包含隐藏文件注:“.filename” 以点开头的是隐藏文件 import os for cur_path,cur_dirs,cur_files in os.wa ...

随机推荐

  1. @loj - 2290@ 「THUWC 2017」随机二分图

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个左右各 n 个点的二分图,图中的边会按照一定的规律随机出现. ...

  2. 原生js实现计时器

    https://www.cnblogs.com/sandraryan/ 点击开始计时,可以计次,暂停.点了暂停可以继续计时,计次,点击重置清空. <!DOCTYPE html> <h ...

  3. poj 3278(hdu 2717) Catch That Cow(bfs)

    Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. HDU 2844 混合背包、

    题意:一个人想买手表,给你n个价值的硬币,然后给你n个价值硬币对应的个数.但是呢,这个人只知道这个手表的价格不超过m元.问他最多能买多少种价值的手表 思路:dp背包专题 但是- - 一直不知道该怎么d ...

  5. mybatis 一对多查询 集合创建空对象的问题

    在做 mybatis 一对多查询的时候, resultMap 里面用到了集合标签 collection ,后来发现 当该条数据没有子集的时候, collection 会自动创建一个属性都是null的对 ...

  6. Django OMR QuerySet的特性/存在意义

    QuerySet存在的意义主要在惰性机制和缓存两点 ---------->惰性机制: 所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个Quer ...

  7. webpack学习(一)项目中安装webpack

    如何在项目中安装webpack,webpack-cli? 前提:电脑安装了 node和npm包管理工具 1 创建项目文件夹或者在已有的项目中打开终端  输入相关命令: npm init 因为已经安装好 ...

  8. vue+element-ui 字体自适应不同屏幕

    项目背景:屏幕自适应问题,当在不同分辨率的屏幕上显示页面时,页面的字体需要根据屏幕大小来自适应,想到使用rem作为字体的单位 vue-cli脚手架下的index.html中写入以下js脚本 <s ...

  9. TOJ 6121: 学长的情书 ( 二分)

    传送门: 点我 6121: 学长的情书  时间限制(普通/Java):2000MS/6000MS     内存限制:65536KByte总提交: 79            测试通过:2 描述 抹布收 ...

  10. 2019.12.15 QLU and SNDU期末联赛

    题目列表: 1582.柳予欣的舔狗行为 1587.柳予欣的女朋友们在分享水果 1585.柳予欣和她女朋友的购物计划 1579.FFFFFunctions 1588.Zeckendorf 1586.柳予 ...