#include <windows.h>
#include <tchar.h>
#include <stdio.h> #include <assert.h> char* WideCharToMultiByte(LPCTSTR widestr)
{
int num = WideCharToMultiByte(CP_OEMCP,NULL,widestr,-,NULL,,NULL,FALSE);
char *pchar = new char[num];
WideCharToMultiByte (CP_OEMCP,NULL,widestr,-,pchar,num,NULL,FALSE);
return pchar;
} bool IsDirectory(const LPTSTR & strPath)
{
DWORD dwAttrib = GetFileAttributes( strPath );
return static_cast<bool>( ( dwAttrib != 0xffffffff
&& (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) );
} int main()
{
HANDLE hDir;
BYTE* pBuffer = (LPBYTE)new CHAR[];
DWORD dwBufferSize;
LPTSTR lpPath = _T("D:\\同步目录\\");
WCHAR szFileName[MAX_PATH];
char* szFilePath; PFILE_NOTIFY_INFORMATION pNotify = (PFILE_NOTIFY_INFORMATION)pBuffer; hDir = CreateFile( lpPath, FILE_LIST_DIRECTORY,
FILE_SHARE_READ |
FILE_SHARE_WRITE |
FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OVERLAPPED, NULL);
if (hDir == INVALID_HANDLE_VALUE)
{
printf("INVALID_HANDLE_VALUE");
return ;
} while (TRUE)
{
if(ReadDirectoryChangesW(hDir,
pBuffer,
,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
&dwBufferSize,
NULL,
NULL))
{
memset(szFileName, , MAX_PATH);
memcpy(szFileName, lpPath, _tcslen(lpPath) * sizeof(WCHAR));
memcpy(szFileName + _tcslen(lpPath), pNotify->FileName, pNotify->FileNameLength);
szFilePath = WideCharToMultiByte(szFileName); switch(pNotify->Action)
{
case FILE_ACTION_ADDED:
if (IsDirectory(szFileName))
{
printf("Directory %s added.\n", szFilePath);
}
else
{
printf("File %s added.\n", szFilePath);
}
break;
case FILE_ACTION_REMOVED:
if (IsDirectory(szFileName))
{
printf("Directory %s removed.\n", szFilePath);
}
else
{
printf("File %s removed.\n", szFilePath);
}
break;
case FILE_ACTION_MODIFIED:
if (!IsDirectory(szFileName))
{
printf("File %s modified.\n", szFilePath);
}
break;
case FILE_ACTION_RENAMED_OLD_NAME:
if (pNotify && pNotify->NextEntryOffset != 0UL)
{
PFILE_NOTIFY_INFORMATION pNext = (PFILE_NOTIFY_INFORMATION) ((LPBYTE)pNotify + pNotify->NextEntryOffset);
assert((DWORD)((BYTE*)pNext - pBuffer) < dwBufferSize);
{
WCHAR szFileName2[MAX_PATH];
char* szFilePath2;
memset(szFileName2, , MAX_PATH);
memcpy(szFileName2, lpPath, _tcslen(lpPath) * sizeof(WCHAR));
memcpy(szFileName2 + _tcslen(lpPath), pNext->FileName, pNext->FileNameLength);
szFilePath2 = WideCharToMultiByte(szFileName2);
if (IsDirectory(szFileName2))
{
printf("Directory name changed from %s to %s.\n", szFilePath, szFilePath2);
}
else
{
printf("File name changed from %s to %s.\n", szFilePath, szFilePath2);
}
}
}
break;
case FILE_ACTION_RENAMED_NEW_NAME:
printf("FILE_ACTION_RENAMED_NEW_NAME.\n");
break;
default:
break;
}
}
}
}
关于ReadDirectoryChangesW的详细介绍可以查看
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx

VC++文件监控 ReadDirectoryChangesW的更多相关文章

  1. 在C#使用文件监控对象FileSystemWatcher的几种方案

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务 ...

  2. 使用文件监控对象FileSystemWatcher实现数据同步

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务 ...

  3. C#使用文件监控对象FileSystemWatcher 实现数据同步

    在C#使用文件监控对象FileSystemWatcher 实现数据同步 2013-12-12 18:24 by 幕三少, 352 阅读, 3 评论, 收藏, 编辑 最近在项目中有这么个需求,就是得去实 ...

  4. C#使用FileSystemWatcher控件实现的文件监控功能示例

    本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...

  5. java实现文件监控

    文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...

  6. Nodejs文件监控chokidar

    最近有个需求是扫描用例,用例是放在svn上,如果每次扫描都去遍历目录的话会有占用太多的io,所以想着用文件监控,有文件变化时只对该文件进行操作. Nodejs里的 chokidar 模块可以更好的对文 ...

  7. Linux下日志文件监控系统Logwatch的使用记录

    Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...

  8. 超实用文件监控多线程FTP上传工具

    这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...

  9. VC文件操作

    VC文件操作 重命名文件: 注意: 该操作对文件夹一样有效! CFileFind Finder; CString sOldPath = _T("D:\\tt.txt"); CStr ...

随机推荐

  1. P1082||T1200 同余方程 codevs|| 洛谷

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   http://codevs.cn/problem/1200/||https://www.luogu.o ...

  2. Ubuntu 16.04切换/home中文目录为英文目录

    其实这个方法是具有技巧性的,不建议使用. 1.先转换成英文 sudo gedit /etc/default/locale 将内容改为: LANG=”en_US.UTF-8″ LANGUAGE=”en_ ...

  3. Luca Canali

    https://github.com/LucaCanali http://cern.ch/canali/

  4. sizeThatFits and sizeToFit

    http://liuxing8807.blog.163.com/blog/static/9703530520134381526554/ sizeThatFits and sizeToFit是UIVie ...

  5. Cisco路由器配置ADSL上网

    cisco1841#sh run Building configuration... Current configuration : 2970 bytes ! version 12.4 service ...

  6. [Vue @Component] Simplify Vue Components with vue-class-component

    While traditional Vue components require a data function which returns an object and a method object ...

  7. 【bzoj3105】【cqoi2013】【新Nim游戏】【线性基+贪心】

    Description 传统的Nim游戏是这种:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量能够不同).两个游戏者轮流操作,每次能够选一个火柴堆拿走若干根火柴.能够仅仅拿一根,也能够拿走整堆火柴 ...

  8. IOS - 设置与帮助界面

    设置与帮助 改动头像, 改动password, 移动客服, 帮助, 声明, 关于我们. 代码 // // IndexSetting600ViewController.h // SymptomCheck ...

  9. [LeetCode][Java] N-Queens II

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  10. Android抽屉菜单DrawerLayout的实现案例

    (1)项目布局文件 activity_main.xml <android.support.v4.widget.DrawerLayout xmlns:android="http://sc ...