#include <stdio.h> #include <Windows.h> #include <tlhelp32.h>
DWORD WINAPI MonitorFileThreadProc(LPVOID lParam) { char *pszDirectory = (char *)lParam; BOOL bRet = FALSE; BYTE Buffer[1024] = { 0 };
FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer; DWORD dwByteReturn = 0; HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (INVALID_HANDLE_VALUE == hFile) return 1;
while (TRUE) { ZeroMemory(Buffer, sizeof(Buffer)); bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_LAST_WRITE, &dwByteReturn, NULL, NULL); if (TRUE == bRet) { char szFileName[MAX_PATH] = { 0 };
WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,(pBuffer->FileNameLength / 2), szFileName,MAX_PATH,NULL,NULL);
char FullFilePath[1024] = { 0 }; strncpy(FullFilePath, pszDirectory, strlen(pszDirectory)); strcat(FullFilePath, szFileName);
switch (pBuffer->Action) { case FILE_ACTION_ADDED: { printf("添加: %s \n", FullFilePath); break; } case FILE_ACTION_REMOVED: { printf("删除: %s \n", FullFilePath); break; } case FILE_ACTION_MODIFIED: { printf("修改: %s \n", FullFilePath); break; } case FILE_ACTION_RENAMED_OLD_NAME: { printf("重命名: %s", szFileName); if (0 != pBuffer->NextEntryOffset) { FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *) ((DWORD)pBuffer + pBuffer->NextEntryOffset); switch (tmpBuffer->Action) { case FILE_ACTION_RENAMED_NEW_NAME: { ZeroMemory(szFileName, MAX_PATH); WideCharToMultiByte(CP_ACP,0,tmpBuffer->FileName, (tmpBuffer->FileNameLength / 2), szFileName,MAX_PATH,NULL,NULL); printf(" -> %s \n", szFileName); break; } } } break; } case FILE_ACTION_RENAMED_NEW_NAME: { printf("重命名(new): %s \n", FullFilePath); break; } } } } CloseHandle(hFile); return 0; }
int main(int argc, char * argv[]) { char *pszDirectory = "C:\\";
HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); return 0; }
|