⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tryreaddirectorychangeswview.cpp

📁 这个则是一个简单的监视文件系统的例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		else
		{
			if ( m_hVxD == INVALID_HANDLE_VALUE )
			{
				DWORD dwErrCode = ::GetLastError();
				TCHAR tsErrMsg[256] = _T("Failed in loading \\\\.\\filevxd.vxd: ");

				GetSystemErrorString(dwErrCode, tsErrMsg + 35, sizeof(tsErrMsg));
				AfxMessageBox(tsErrMsg);
				return -1;
			}
		}
	}
#else
	else
	{
		if ( m_hVxD == INVALID_HANDLE_VALUE )
		{
			DWORD dwReturnBytes = 0;
			BOOLEAN fTimeIsDuration = FALSE;

			m_hVxD = CreateFile(_T("\\\\.\\filevxd.vxd"), 0, 0, NULL, 0, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, NULL);
			if ( m_hVxD == INVALID_HANDLE_VALUE )
			{
				DWORD dwErrCode = GetLastError();
				CString csErrMsg;

				csErrMsg.Format(_T("Driver (\\\\.\\filevxd.vxd) is not loaded properly: 0x%08X"), dwErrCode);
				MessageBox(csErrMsg);
				return dwErrCode;
			}
			else if ( !DeviceIoControl(m_hVxD, FILEMON_zerostats, NULL, 0, NULL, 0, &dwReturnBytes, NULL) )
			{
				DWORD dwErrCode = GetLastError();
				CString csErrMsg;

				csErrMsg.Format(_T("Can't initialize device driver: 0x%08X"), dwErrCode);
				MessageBox(csErrMsg);
				return dwErrCode;
			}
			else if ( !DeviceIoControl(m_hVxD, FILEMON_timetype, &fTimeIsDuration, sizeof(BOOLEAN), NULL, 0, &dwReturnBytes, NULL) )
			{
			}
		}
	}
#endif
	return 0;
}

void CTryReadDirectoryChangesWView::OnDestroy() 
{
	if ( m_fIsNT )
	{
		SetEvent(m_hEventArray[1]);
		Sleep(0);
		EnterCriticalSection(&m_objCriticalSection);
		if ( m_hDir != INVALID_HANDLE_VALUE )
		{
			CancelIo(m_hDir);
			CloseHandle(m_hDir);
			m_hDir = INVALID_HANDLE_VALUE;
		}
		CloseHandle(m_hEventArray[1]);
		CloseHandle(m_hEventArray[0]);
		DeleteCriticalSection(&m_objCriticalSection);
	}
#ifndef FORDEMO
	else
	{
		SetEvent(m_hEventArray[1]);
		Sleep(0);
		EnterCriticalSection(&m_objCriticalSection);
		if ( m_hVxD != INVALID_HANDLE_VALUE )
		{
			DeviceIoControl(m_hVxD, DIRMON_CancelReadChange, NULL, NULL, NULL, NULL, NULL, NULL);
			CloseHandle(m_hVxD);
			m_hVxD = INVALID_HANDLE_VALUE;
		}
		CloseHandle(m_hEventArray[1]);
		CloseHandle(m_hEventArray[0]);
		DeleteCriticalSection(&m_objCriticalSection);
	}
#else
	else
	{
		CloseHandle(m_hVxD);
		m_hVxD = INVALID_HANDLE_VALUE;
	}
#endif

	CEditView::OnDestroy();
}

UINT CTryReadDirectoryChangesWView::ReadDirectoryChangesWCompletionRoutine(CTryReadDirectoryChangesWView *pView)
{
	if ( pView->m_fIsNT )
	{
		DWORD dwWait;
		BOOL fGotResult;

		while ( 1 )
		{
			dwWait = WaitForMultipleObjects(2, pView->m_hEventArray, FALSE, INFINITE);
//			if ( dwWait == WAIT_ABANDONED_0 || dwWait == WAIT_ABANDONED_0 + 1 || dwWait == WAIT_OBJECT_0 + 1 )
			if ( dwWait != WAIT_OBJECT_0 )
				return 0;

			EnterCriticalSection(&pView->m_objCriticalSection);
			fGotResult = GetOverlappedResult(pView->m_hDir, &pView->m_objOverlapped, &pView->m_dwBytesReturned, TRUE);
			ResetEvent(pView->m_hEventArray[0]);
			if ( fGotResult )
			{
				CString _csEditText, csEditText, csTemp;
				LPCTSTR psAction = NULL;
				TCHAR tsFilename[MAX_PATH + 1];
				PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)pView->m_cBuf;

				pView->GetWindowText(_csEditText);
				csTemp.Format(_T("%d:\r\n"), ++pView->m_nReadTimes);
				csEditText += csTemp;
				while ( 1 )
				{
#ifdef UNICODE
					memcpy(tsFilename, p->FileName, p->FileNameLength);
					tsFilename[p->FileNameLength >> 1] = NULL;
					GetLongPathName(tsFilename, tsFilename, sizeof(tsFilename));
#else
					WCHAR wsFilename[MAX_PATH * 4 + 1];

					memcpy(wsFilename, p->FileName, p->FileNameLength);
					wsFilename[p->FileNameLength >> 1] = NULL;
					if ( WideCharToMultiByte(CP_THREAD_ACP, 0, wsFilename, (p->FileNameLength >> 1) + 1, tsFilename, sizeof(tsFilename), NULL, NULL) == 0 )
						_tcscpy(tsFilename, _T("Error to convert the filename!"));
					else
						GetLongPathName(tsFilename, tsFilename, sizeof(tsFilename));
#endif
					switch ( p->Action )
					{
					case FILE_ACTION_ADDED:
						psAction = _T("File Added"); break;
					case FILE_ACTION_REMOVED:
						psAction = _T("File Removed"); break;
					case FILE_ACTION_MODIFIED:
						psAction = _T("File Modified"); break;
					case FILE_ACTION_RENAMED_OLD_NAME:
						psAction = _T("File Renamed, Old Name"); break;
					case FILE_ACTION_RENAMED_NEW_NAME:
						psAction = _T("File Renamed, New Name"); break;
					default:
						psAction = _T("Unknown Action");
					}
					csTemp.Format(_T("%d. %s: %s\r\n"), ++pView->m_nLineNo, psAction, tsFilename);
					csEditText += _T("    ");
					csEditText += csTemp;
					if ( p->NextEntryOffset )
						p = (PFILE_NOTIFY_INFORMATION)((char*)p + p->NextEntryOffset);
					else
						break;
				}
				if ( _csEditText.GetLength() + csEditText.GetLength() > 65536 )
					_csEditText = csEditText;
				else
					_csEditText += csEditText;
				pView->SetRedraw(FALSE);
				pView->SetWindowText(_csEditText);
				pView->GetEditCtrl().LineScroll(pView->GetEditCtrl().GetLineCount() - 1);
				pView->SetRedraw();

				Sleep(100);
				ReadDirectoryChangesW(pView->m_hDir, pView->m_cBuf, 65536, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY, NULL, &pView->m_objOverlapped, NULL);
			}
			LeaveCriticalSection(&pView->m_objCriticalSection);
		}
	}
#ifndef FORDEMO
	else
	{
		DWORD dwWait;
		BOOL fGotResult;

		while ( 1 )
		{
			dwWait = WaitForMultipleObjects(2, pView->m_hEventArray, FALSE, INFINITE);
			if ( dwWait != WAIT_OBJECT_0 )
				return 0;

			EnterCriticalSection(&pView->m_objCriticalSection);
			fGotResult = GetOverlappedResult(pView->m_hVxD, &pView->m_objOverlapped, &pView->m_dwBytesReturned, TRUE);
			ResetEvent(pView->m_hEventArray[0]);
			if ( fGotResult )
			{
				CString _csEditText, csEditText, csTemp;
				LPCTSTR psAction = NULL;
				TCHAR tsFilename[MAX_PATH + 1];
				PDIRCHANGEITEM p = (PDIRCHANGEITEM)pView->m_cBuf;

				pView->GetWindowText(_csEditText);
				csTemp.Format(_T("%d:\r\n"), ++pView->m_nReadTimes);
				csEditText += csTemp;
				while ( 1 )
				{
#ifdef UNICODE
					MultiByteToWideChar(CP_THREAD_ACP, 0, p->sRelativePathName, strlen(p->sRelativePathName) + 1, tsFilename, sizeof(tsFilename));
#else
					_tcscpy(tsFilename, p->sRelativePathName);
#endif
					if ( _tcschr(tsFilename, _T('*')) || _tcschr(tsFilename, _T('?')) )
					{
						PTCHAR ptsFilenameTemp = _tcsrchr(tsFilename, _T('\\'));

						if ( ptsFilenameTemp && ptsFilenameTemp != tsFilename )
						{
							CString csDir = pView->m_csDir;
							TCHAR tsFilenameTemp[MAX_PATH];

							if ( csDir.GetAt(csDir.GetLength() - 1) != _T('\\') )
								csDir += _T('\\');
							_tcscpy(tsFilenameTemp, ptsFilenameTemp + 1);
//							OutputDebugString(tsFilenameTemp);
							*ptsFilenameTemp = 0;
//							OutputDebugString((LPCTSTR)(csDir + tsFilename));
							GetLongPathName((LPCTSTR)(csDir + tsFilename), tsFilename, sizeof(tsFilename));
//							OutputDebugString(tsFilename);
							ptsFilenameTemp = tsFilename + _tcslen(tsFilename);
							if ( *(ptsFilenameTemp - 1) != _T('\\') )
								*ptsFilenameTemp++ = _T('\\');
							_tcscpy(ptsFilenameTemp, tsFilenameTemp);
//							OutputDebugString(tsFilename);
							ptsFilenameTemp = tsFilename + csDir.GetLength();
							memmove(tsFilename, ptsFilenameTemp, (_tcslen(ptsFilenameTemp) + 1) * sizeof(TCHAR));
//							OutputDebugString(tsFilename);
						}
					}
					else
						GetLongPathName(tsFilename, tsFilename, sizeof(tsFilename));
					switch ( p->wAction )
					{
					case DIRMON_ACTION_ADDED:		//			0x00000001
						psAction = _T("File Added"); break;
					case DIRMON_ACTION_REMOVED:		//			0x00000002
						psAction = _T("File Removed"); break;
					case DIRMON_ACTION_MODIFIED:	//			0x00000003
						psAction = _T("File Modified"); break;
					case DIRMON_ACTION_RENAMED_OLD_NAME:	//	0x00000004
						psAction = _T("File Renamed, Old Name"); break;
					case DIRMON_ACTION_RENAMED_NEW_NAME:
						psAction = _T("File Renamed, New Name"); break;
					default:
						psAction = _T("Unknown Action");
					}
					csTemp.Format(_T("%d. %s: %s\r\n"), ++pView->m_nLineNo, psAction, tsFilename);
					csEditText += _T("    ");
					csEditText += csTemp;
					if ( p->wNextEntryOffset )
						p = (PDIRCHANGEITEM)((char*)p + p->wNextEntryOffset);
					else
						break;
				}
				if ( _csEditText.GetLength() + csEditText.GetLength() >= 30000 )
					_csEditText = csEditText;
				else
					_csEditText += csEditText;
				pView->SetRedraw(FALSE);
				pView->SetWindowText(_csEditText);
				pView->GetEditCtrl().LineScroll(pView->GetEditCtrl().GetLineCount() - 1);
				pView->SetRedraw();

//				Sleep(30000);
				Sleep(100);
				DeviceIoControl(pView->m_hVxD, DIRMON_ReadChange, NULL, NULL, pView->m_cBuf, 65536, NULL, &pView->m_objOverlapped);
			}
			LeaveCriticalSection(&pView->m_objCriticalSection);
		}
		return 0;
	}
#else
	else
		return 0;
#endif
}

#ifndef FORDEMO
#else

char g_cStats[MAX_STORE];

void CTryReadDirectoryChangesWView::OnTimer(UINT nIDEvent) 
{
	if ( m_fIsMonitoring )
	{
		DWORD startTime;
		DWORD dwReturnBytes;
		PENTRY ptr;
		CString csText;
		ULONG len;
		CString csTemp;
		char *pAction, *pPath, *pEnd;

		startTime = GetTickCount();
		while ( 1 )
		{
			if ( !DeviceIoControl(m_hVxD, FILEMON_getstats, NULL, 0, g_cStats, sizeof(g_cStats), &dwReturnBytes, NULL) || dwReturnBytes == 0 )
				break;
			else if ( dwReturnBytes >= sizeof(int) + 2 )
			{
				SetRedraw(FALSE);
				GetWindowText(csText);

				for ( ptr = (PENTRY)g_cStats; (char*)ptr < min(g_cStats + dwReturnBytes, g_cStats + sizeof(g_cStats)); )
				{
					len = strlen(ptr->text);

					if ( ptr->seq > m_nSeqNo )
					{
						m_nSeqNo = ptr->seq;
						for ( pAction = ptr->text; *pAction != '\t'; pAction++ );
						for ( pPath = ++pAction; *pPath != '\t'; pPath++ );
						*pPath++ = 0;
						for ( pEnd = pPath; *pEnd != '\t'; pEnd++ );
						*pEnd = 0;
						if ( strnicmp(pPath, (LPCSTR)m_csDir, m_csDir.GetLength()) == 0 && strcmp(pAction, "Seek") != 0 && strcmp(pAction, "Lock") != 0 && strcmp(pAction, "Unlock") != 0 && strcmp(pAction, "FindOpen") != 0 && strcmp(pAction, "FindClose") != 0 && strcmp(pAction, "FindNext") != 0 && strcmp(pAction, "Read") != 0 && strcmp(pAction, "GetDiskInfo") != 0 )
						{
							csTemp.Format(_T("%d. %s: %s, %s\r\n"), ++m_nLineNo, pAction, pPath, (LPCSTR)m_csDir);
							csText += csTemp;
						}
					}

					ptr = (PENTRY)(ptr->text + len + 1);
				}

				SetWindowText(csText);
				GetEditCtrl().LineScroll(m_nLineNo);
				SetRedraw();
			}
			if ( GetTickCount() - startTime > 1000 )
				break;
		}
	}

	CEditView::OnTimer(nIDEvent);
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -