VC++ 目录监控

  1. // MonitorTest.cpp : Defines the entry point for the console application. 
  2. // 
  3.  
  4. #include <windows.h> 
  5. #include <stdio.h> 
  6.  
  7. DWORD WINAPI ThreadProc(LPVOID lpParam) 
  8.     BOOL bRet = FALSE; 
  9.     BYTE Buffer[1024] = { 0 }; 
  10.  
  11.     FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer; 
  12.     DWORD BytesReturned = 0; 
  13.     HANDLE hFile = CreateFile("c:\\"
  14.                 FILE_LIST_DIRECTORY,  
  15.                 FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE, 
  16.                 NULL, 
  17.                 OPEN_EXISTING, 
  18.                 FILE_FLAG_BACKUP_SEMANTICS, 
  19.                 NULL); 
  20.     if ( INVALID_HANDLE_VALUE == hFile ) 
  21.     { 
  22.         return 1; 
  23.     } 
  24.  
  25.     printf("monitor... \r\n"); 
  26.  
  27.     while ( TRUE ) 
  28.     { 
  29.         ZeroMemory(Buffer, 1024); 
  30.         //子线程一直在读取目录的改变 
  31.         //调用系统ReadDirectoryChangesW API 
  32.         bRet = ReadDirectoryChangesW(hFile, 
  33.                         &Buffer, 
  34.                         sizeof(Buffer), 
  35.                         TRUE, 
  36.                         FILE_NOTIFY_CHANGE_FILE_NAME |  // 修改文件名 
  37.                         FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件属性 
  38.                         FILE_NOTIFY_CHANGE_LAST_WRITE , // 最后一次写入 
  39.                         &BytesReturned, 
  40.                         NULL, NULL); 
  41.          
  42.         if ( bRet == TRUE ) 
  43.         { 
  44.             char szFileName[MAX_PATH] = { 0 }; 
  45.  
  46.             // 宽字符转换多字节 
  47.             WideCharToMultiByte(CP_ACP, 
  48.                                 0, 
  49.                                 pBuffer->FileName, 
  50.                                 pBuffer->FileNameLength / 2, 
  51.                                 szFileName, 
  52.                                 MAX_PATH, 
  53.                                 NULL, 
  54.                                 NULL); 
  55.  
  56.             switch(pBuffer->Action)  
  57.             {  
  58.                 // 添加 
  59.             case FILE_ACTION_ADDED:  
  60.                 { 
  61.                     printf("添加 : %s\r\n", szFileName); 
  62.                      
  63.                     break
  64.                 } 
  65.                 // 删除 
  66.             case FILE_ACTION_REMOVED:  
  67.                 { 
  68.                     printf("删除 : %s\r\n", szFileName); 
  69.                      
  70.                     break;  
  71.                 } 
  72.                 // 修改 
  73.             case FILE_ACTION_MODIFIED:  
  74.                 { 
  75.                     printf("修改 : %s\r\n", szFileName); 
  76.                      
  77.                     break;  
  78.                 } 
  79.                 // 重命名 
  80.             case FILE_ACTION_RENAMED_OLD_NAME:  
  81.                 { 
  82.                     printf("重命名 : %s", szFileName); 
  83.                     if ( pBuffer->NextEntryOffset != 0 ) 
  84.                     { 
  85.                         FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)((DWORD)pBuffer + pBuffer->NextEntryOffset); 
  86.                         switch ( tmpBuffer->Action ) 
  87.                         { 
  88.                         case FILE_ACTION_RENAMED_NEW_NAME: 
  89.                             {         
  90.                                 ZeroMemory(szFileName, MAX_PATH); 
  91.                                 WideCharToMultiByte(CP_ACP, 
  92.                                     0, 
  93.                                     tmpBuffer->FileName, 
  94.                                     tmpBuffer->FileNameLength / 2, 
  95.                                     szFileName, 
  96.                                     MAX_PATH, 
  97.                                     NULL, 
  98.                                     NULL); 
  99.                                 printf(" ->  : %s \r\n", szFileName); 
  100.                                 break
  101.                             } 
  102.                         } 
  103.                     } 
  104.                     break;  
  105.                 } 
  106.             case FILE_ACTION_RENAMED_NEW_NAME:  
  107.                 { 
  108.                     printf("重命名(new) : %s\r\n", szFileName); 
  109.                 } 
  110.             } 
  111.         } 
  112.     } 
  113.  
  114.     CloseHandle(hFile); 
  115.  
  116.     return 0; 
  117.  
  118. int main(int argc, char* argv[]) 
  119.     HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); 
  120.     if ( hThread == NULL ) 
  121.     { 
  122.         return -1; 
  123.     } 
  124.     //等待线程结束 
  125.     WaitForSingleObject(hThread, INFINITE); 
  126.     CloseHandle(hThread); 
  127.  
  128.     return 0; 
  129. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值