VC++文件监控 ReadDirectoryChangesW
#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的更多相关文章
- 在C#使用文件监控对象FileSystemWatcher的几种方案
最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务 ...
- 使用文件监控对象FileSystemWatcher实现数据同步
最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务 ...
- C#使用文件监控对象FileSystemWatcher 实现数据同步
在C#使用文件监控对象FileSystemWatcher 实现数据同步 2013-12-12 18:24 by 幕三少, 352 阅读, 3 评论, 收藏, 编辑 最近在项目中有这么个需求,就是得去实 ...
- C#使用FileSystemWatcher控件实现的文件监控功能示例
本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...
- java实现文件监控
文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...
- Nodejs文件监控chokidar
最近有个需求是扫描用例,用例是放在svn上,如果每次扫描都去遍历目录的话会有占用太多的io,所以想着用文件监控,有文件变化时只对该文件进行操作. Nodejs里的 chokidar 模块可以更好的对文 ...
- Linux下日志文件监控系统Logwatch的使用记录
Linux下日志文件监控系统Logwatch的使用记录 原文:http://www.cnblogs.com/kevingrace/p/6519504.html 在维护Linux服务器时,经常需要查看系 ...
- 超实用文件监控多线程FTP上传工具
这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...
- VC文件操作
VC文件操作 重命名文件: 注意: 该操作对文件夹一样有效! CFileFind Finder; CString sOldPath = _T("D:\\tt.txt"); CStr ...
随机推荐
- android获取年月日时分秒
Calendar calendar=Calendar.getInstance(); //获取当前时间,作为图标的名字 String year=calendar.get(Calendar.YEAR)+& ...
- ubuntu无法update
ubuntu系统执行sudo apt-get update报错解决方法: 编辑源列表文件 sudo vi /etc/apt/sources.list 将原来的列表删除,添加如下内容(中科大镜像源) d ...
- ZooKeeper实现配置中心的实例(原生API实现)(转)
说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...
- SpringMVC断言--Assert
Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异 ...
- MySQL语句给字段值加1
update tbl_moment_like set like_count = like_count + #{addLikes} where mid = #{mid}
- Codeforces Round #263 (Div. 1)-A,B,C
A: 这道题目还是非常easy的,做过非常多遍了.相似于分割木板的问题. 把全部的数放在一个优先队列里,弹出两个最大的,然后合并,把结果放进去.依次进行. #include <iostream& ...
- ios5--计算器
// // ViewController.m // 01-加法计算器 // // 首先找main.m文件,然后找AppDelegate,然后找Main Inteferce主交互故事板,然后加载箭头指向 ...
- [Codeforces Round49F] Session in BSU
[题目链接] http://codeforces.com/contest/1027/problem/F [算法] 二分图匹配 [代码] #include<bits/stdc++.h> #p ...
- B1877 [SDOI2009]晨跑 费用流
其实之前写过一个板子,但是一点印象都没有,所以今天重写了一下,顺便把这个题当成板子就行了. 其实费用流就是把bfs换成spfa,但是中间有一个原则,就是费用优先,在费用(就是c)上跑spfa,顺便求出 ...
- 洛谷P2516 [HAOI2010]最长公共子序列
题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...