ReadDirectoryChangesW监视文件夹内的文件变更情况
ReadDirectoryChangesW监视文件夹内的文件变化情况
char notify[1024];
memset(notify,'\0',1024);
FILE_NOTIFY_INFORMATION *in_out_notification=(FILE_NOTIFY_INFORMATION *)notify;
DWORD in_MemorySize = 1024;
DWORD *in_out_BytesReturned = new DWORD;
HANDLE handle_directory=CreateFile("D:\\苗", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);
if(handle_directory==INVALID_HANDLE_VALUE)
{
DWORD ERROR_DIR=GetLastError();
AfxMessageBox("打开文件目录失败!!");
}
BOOL watch_state;
int num = 0;
string str = "";
CString temp = _T("");
LPOVERLAPPED lpOverlapped = new OVERLAPPED;
LPDWORD lpNumberOfBytesTransferred = new DWORD;
while (TRUE)
{
watch_state = ReadDirectoryChangesW(handle_directory,(LPVOID)in_out_notification,
in_MemorySize,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_SIZE,
(LPDWORD)in_out_BytesReturned,
NULL,
NULL);
string file_name;
DWORD length=WideCharToMultiByte(0,0,in_out_notification->FileName,-1,NULL,0,NULL,NULL);
PSTR ps=new CHAR[length];
if(length>=0)
{
WideCharToMultiByte(0,0,in_out_notification->FileName,-1,ps,length,NULL,NULL);
file_name=string(ps);
delete[] ps;
}
if (GetLastError()==ERROR_INVALID_FUNCTION)
{
AfxMessageBox("系统不支持!");
}
else if(watch_state==0)
{
AfxMessageBox("监控失败!");
}
else if (GetLastError()==ERROR_NOTIFY_ENUM_DIR)
{
AfxMessageBox("内存溢出!");
}
memset(notify,'\0',1024);
}
这是我根据网上写的一段关于监视制定目录下面的文件的变化情况的,我们假设这个制定的目录为A,这个函数可以很好的监视A目录里面的文件的修改,删除等等,但是对于文件或者文件名的修改不能很好的监视,如果是A根目录下面的文件的文字被修改了,我们可以监视到修改前和修改后的文件名,但是对于A下面的子目录我们就不能很好的监视了,只能监视到修改前的文件名而得不到修改后的文件名,还有对于A下面的文件夹的名字的修改也只能监视到文件夹修改前的名字而监视不到文件夹修改后的文件,请大虾来赐教!
------解决方案--------------------
不是写了解决方案么,1是解析FILE_NOTIFY_INFORMATION 指针,2是用重叠IO或者IOCP。自己去网上查吧,源代码很多的。
char notify[1024];
memset(notify,'\0',1024);
FILE_NOTIFY_INFORMATION *in_out_notification=(FILE_NOTIFY_INFORMATION *)notify;
DWORD in_MemorySize = 1024;
DWORD *in_out_BytesReturned = new DWORD;
HANDLE handle_directory=CreateFile("D:\\苗", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);
if(handle_directory==INVALID_HANDLE_VALUE)
{
DWORD ERROR_DIR=GetLastError();
AfxMessageBox("打开文件目录失败!!");
}
BOOL watch_state;
int num = 0;
string str = "";
CString temp = _T("");
LPOVERLAPPED lpOverlapped = new OVERLAPPED;
LPDWORD lpNumberOfBytesTransferred = new DWORD;
while (TRUE)
{
watch_state = ReadDirectoryChangesW(handle_directory,(LPVOID)in_out_notification,
in_MemorySize,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_SIZE,
(LPDWORD)in_out_BytesReturned,
NULL,
NULL);
string file_name;
DWORD length=WideCharToMultiByte(0,0,in_out_notification->FileName,-1,NULL,0,NULL,NULL);
PSTR ps=new CHAR[length];
if(length>=0)
{
WideCharToMultiByte(0,0,in_out_notification->FileName,-1,ps,length,NULL,NULL);
file_name=string(ps);
delete[] ps;
}
if (GetLastError()==ERROR_INVALID_FUNCTION)
{
AfxMessageBox("系统不支持!");
}
else if(watch_state==0)
{
AfxMessageBox("监控失败!");
}
else if (GetLastError()==ERROR_NOTIFY_ENUM_DIR)
{
AfxMessageBox("内存溢出!");
}
memset(notify,'\0',1024);
}
这是我根据网上写的一段关于监视制定目录下面的文件的变化情况的,我们假设这个制定的目录为A,这个函数可以很好的监视A目录里面的文件的修改,删除等等,但是对于文件或者文件名的修改不能很好的监视,如果是A根目录下面的文件的文字被修改了,我们可以监视到修改前和修改后的文件名,但是对于A下面的子目录我们就不能很好的监视了,只能监视到修改前的文件名而得不到修改后的文件名,还有对于A下面的文件夹的名字的修改也只能监视到文件夹修改前的名字而监视不到文件夹修改后的文件,请大虾来赐教!
------解决方案--------------------
不是写了解决方案么,1是解析FILE_NOTIFY_INFORMATION 指针,2是用重叠IO或者IOCP。自己去网上查吧,源代码很多的。