#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. 【Java基础】基本类型与运算【重要】

    0.   Java基本数据类型 Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表 ...

  2. nginx,tornado,websocket,supervisord配置成型

    因为要上生产环境,所以配置还是专业一些比较好. nginx.conf upstream websocket_host { server 127.0.0.1:9527; } location /ws_l ...

  3. Ubuntu桌面卡死时的处理

    1.这种方式可以尝试,但是不成功 sudo skill x sudo stop lightdm sudo start lightdm 2.这种方式比较可靠 ps -t tty7 kill 27342 ...

  4. Oracle Multitenant Environment (五) Create PDB

    Creating and Removing PDBs with SQL*Plus This chapter contains the following topics: About Creating ...

  5. 《WF in 24 Hours》读书笔记 - Hour 3(1) - Workflow:添加宿主和事件监听

    1. 创建项目组,并添加一个Console Project和Activity Library,在Activity Library的项目中添加CodeActivity1和CodeActivity2,最终 ...

  6. ci 在阿里云访问的时候404

    最近想把ci 弄到阿里云去,结果发现,本地好好的,到了阿里云就404了.网上查了下 原来是 配置文件的问题. 配置文件就是 vhost下面的 **.conf文件  要有这个才行 location / ...

  7. HDU 1133 Buy the Ticket 卡特兰数

    设50元的人为+1 100元的人为-1 满足前随意k个人的和大于等于0 卡特兰数 C(n+m, m)-C(n+m, m+1)*n!*m! import java.math.*; import java ...

  8. srm 539

    http://mlz000.github.io/2015/07/15/srm-539/ 250 Description: 从若干个盒子中随意选择几个装石头.每一个盒子容量都有上下限,一旦选择使用某个盒 ...

  9. WPF学习笔记:ComboBox的数据绑定

    UI <UserControl x:Class="UnitViews.UserMeUV" xmlns="http://schemas.microsoft.com/w ...

  10. 20170410 --- Linux备课资料 --- 压缩与解压缩

    这节课我们来学习一下压缩与解压缩,那什么是压缩与解压缩呢? 联想一下Windows系统: 选中文件,右键选择即可 如果压缩,可以选择要压缩的格式,而解压缩直接选择就可以完成了 Linux是通过命令的方 ...