免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4593 | 回复: 7

[C++] FindNextChangeNotification 监控目录怎么得到文件句柄? [复制链接]

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
发表于 2017-12-19 18:20 |显示全部楼层
本帖最后由 yakczh_cu 于 2017-12-19 18:43 编辑

FindNextChangeNotification监控目录示例
http://www.installsetupconfig.co ... rectoryapis3_5.html

watchDir  c:\www
如果c:\www下新建了一个文件 比如 test.html
  1. wprintf(L"Directory %s changed!\n", lpDir);

复制代码

只能打印Directory  c:\www changed!
怎么样才能得到  test.html  这个文件名呢?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-12-20 08:33 |显示全部楼层
使用 ReadDirectoryChangesW

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
发表于 2017-12-20 13:01 |显示全部楼层
本帖最后由 yakczh_cu 于 2017-12-20 13:27 编辑

回复 2# bruceteen
  1. #include <windows.h>

  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <iomanip>
  5. #include <iostream>


  6. using namespace std;
  7. int main()

  8. {
  9.      TCHAR *lpDir = _T("E:\\www\\php");



  10. HANDLE hDir = CreateFile(
  11.     lpDir,
  12.     FILE_LIST_DIRECTORY,
  13.     FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
  14.     NULL,
  15.     OPEN_EXISTING,
  16.     FILE_FLAG_BACKUP_SEMANTICS,
  17.     NULL);

  18.     int nCounter = 0;
  19.     FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
  20.     DWORD dwBytesReturned = 0;   
  21.   FILE_NOTIFY_INFORMATION *pnotify = (FILE_NOTIFY_INFORMATION*)strFileNotifyInfo;
  22.     while(TRUE)
  23.     {
  24.         if( ReadDirectoryChangesW ( hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), true,
  25. FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_CREATION,


  26. &dwBytesReturned, NULL, NULL) == 0)
  27.         {
  28.             printf(_T("Reading Directory Change"));

  29.         }
  30.         else
  31.         {
  32.             printf("\n%s",pnotify->FileName);
  33.             printf("%s",strFileNotifyInfo->FileName );
  34.   
  35.         }
  36.     }
  37. return 0;
  38. }
复制代码
事件能触发,但是打印不出文件名,这是哪里的问题?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-12-21 09:04 |显示全部楼层
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <locale.h>

  5. int main( void )
  6. {
  7.     LPCWSTR lpDir = L"E:\\www\\php";

  8.     HANDLE hDir = CreateFileW( lpDir
  9.                              , FILE_LIST_DIRECTORY
  10.                              , FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE
  11.                              , NULL
  12.                              , OPEN_EXISTING
  13.                              , FILE_FLAG_BACKUP_SEMANTICS
  14.                              , NULL );
  15.     if( hDir == INVALID_HANDLE_VALUE )
  16.         return 1;

  17.     setlocale( LC_CTYPE, "" );
  18.     for( ; ; )
  19.     {
  20.         wchar_t buf[ sizeof(FILE_NOTIFY_INFORMATION) + 2*MAX_PATH ];
  21.         DWORD dwBytesReturned = 0;
  22.         BOOL r = ReadDirectoryChangesW( hDir
  23.                                       , buf, sizeof(buf)
  24.                                       , true
  25.                                       , FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_FILE_NAME
  26.                                       , &dwBytesReturned, NULL, NULL );
  27.         if( r )
  28.         {
  29.             for( FILE_NOTIFY_INFORMATION* pnotify=(FILE_NOTIFY_INFORMATION*)buf; pnotify
  30.                 ; pnotify=pnotify->NextEntryOffset?(FILE_NOTIFY_INFORMATION*)((char*)pnotify+pnotify->NextEntryOffset):NULL )
  31.             {
  32.                 switch( pnotify->Action )
  33.                 {
  34.                 case FILE_ACTION_ADDED:            wprintf(L"added: ");       break;
  35.                 case FILE_ACTION_REMOVED:          wprintf(L"removed: ");     break;
  36.                 case FILE_ACTION_MODIFIED:         wprintf(L"modified: ");    break;
  37.                 case FILE_ACTION_RENAMED_OLD_NAME: wprintf(L"renamed old: "); break;
  38.                 case FILE_ACTION_RENAMED_NEW_NAME: wprintf(L"renamed new: "); break;
  39.                 }
  40.                 wprintf( L"%.*s\n", (int)(pnotify->FileNameLength/sizeof(wchar_t)), pnotify->FileName );
  41.             }
  42.         }
  43.         else
  44.         {
  45.             wprintf( L"failed\n" );
  46.             break;
  47.         }
  48.     }

  49.     CloseHandle( hDir );
  50. }
复制代码

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
发表于 2017-12-21 11:35 |显示全部楼层
本帖最后由 yakczh_cu 于 2017-12-21 11:43 编辑

回复 4# bruceteen

  1. for( FILE_NOTIFY_INFORMATION* pnotify=(FILE_NOTIFY_INFORMATION*)buf; pnotify         ;
  2. pnotify=pnotify->NextEntryOffset?(FILE_NOTIFY_INFORMATION*)((char*)pnotify+pnotify->NextEntryOffset):NULL
  3. )
复制代码


这样写是因为ReadDirectoryChangesW 一次调用 在buf中保存了多个事件吧

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-12-22 14:08 |显示全部楼层
回复 5# yakczh_cu
这样写是因为ReadDirectoryChangesW 一次调用 在buf中保存了多个事件吧
如果是 更名rename,那么一次就有两个事件

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
发表于 2017-12-23 23:23 |显示全部楼层
本帖最后由 yakczh_cu 于 2017-12-24 12:03 编辑
  1.     #include <windows.h>
  2.     #include <stdio.h>
  3.     #include <tchar.h>
  4.     #include <locale.h>


  5.    void getname(wchar_t* ws) {

  6.         DWORD  dwNum = 0;
  7.         dwNum = WideCharToMultiByte(CP_ACP,NULL,ws,-1,0,0,0,0);
  8.         char *psText = new char[dwNum];
  9.         WideCharToMultiByte (CP_ACP,NULL,ws,-1,psText,dwNum,0,0);

  10.    
  11.         printf("\n-----%s----------",psText);

  12.       
  13.      delete []psText;

  14.     }
  15.     int mon( void )
  16.     {
  17.        LPCWSTR lpDir = L"E:\\www\\php";
  18.    
  19.         HANDLE hDir = CreateFileW( lpDir
  20.                                  , FILE_LIST_DIRECTORY
  21.                                  , FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE
  22.                                  , NULL
  23.                                  , OPEN_EXISTING
  24.                                  , FILE_FLAG_BACKUP_SEMANTICS
  25.                                  , NULL );
  26.         if( hDir == INVALID_HANDLE_VALUE )
  27.             return 1;

  28.         setlocale( LC_CTYPE, "" );
  29.         for( ; ; )
  30.         {
  31.             wchar_t buf[ sizeof(FILE_NOTIFY_INFORMATION) + 2*MAX_PATH ];
  32.             DWORD dwBytesReturned = 0;
  33.             BOOL r = ReadDirectoryChangesW( hDir
  34.                                           , buf, sizeof(buf)
  35.                                           , true
  36.                                           , FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_FILE_NAME
  37.                                           , &dwBytesReturned, NULL, NULL );
  38.             if( r )
  39.             {
  40.                 for( FILE_NOTIFY_INFORMATION* pnotify=(FILE_NOTIFY_INFORMATION*)buf; pnotify
  41.                     ; pnotify=pnotify->NextEntryOffset?(FILE_NOTIFY_INFORMATION*)((char*)pnotify+pnotify->NextEntryOffset):NULL )
  42.                 {
  43.                     switch( pnotify->Action )
  44.                     {
  45.                     case FILE_ACTION_ADDED:            wprintf(L"added: ");       break;
  46.                     case FILE_ACTION_REMOVED:          wprintf(L"removed: ");     break;
  47.                     case FILE_ACTION_MODIFIED:         wprintf(L"modified: ");    break;
  48.                     case FILE_ACTION_RENAMED_OLD_NAME: wprintf(L"renamed old: "); break;
  49.                     case FILE_ACTION_RENAMED_NEW_NAME: wprintf(L"renamed new: "); break;
  50.                     }
  51. getname((wchar_t*) pnotify->FileName);

  52.                     //wprintf( L"%.*s\n", (int)(pnotify->FileNameLength/sizeof(wchar_t)), pnotify->FileName );
  53.                 }
  54.             }
  55.             else
  56.             {
  57.                 wprintf( L"failed\n" );
  58.                 break;
  59.             }
  60.         }

  61.         CloseHandle( hDir );
  62.     }
  63. int main(){

  64. wchar_t* test=L"AAAA.jpg";
  65. getname(test);

  66. //mon();


  67. return 0;
  68. }
复制代码

回复 4# bruceteen

把pnotify->FileName 转成 char* 的时候,出了点问题,打印出来是
added:
-----22411.png?----------
modified:
-----22411.png? ---------
modified:
-----22411.pngk----------
modified:
-----22411.png濠-------
   一次调用发生多个事件的时候,pnotify的每个entry后面会有个c3c3 这个c3c3是分割符吗?
****** 16
0018 0000 0003 0000 000a 0000 006e
002e 0070 006e 0067 c3c3 0018 0000
0003 0000 000a 0000 006e 002e 0070
006e 0067 c3c3 0000 0000 0003 0000
000a 0000 006e 002e 0070 006e 0067
0000 0000 0000 0000 0000 0000

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-12-25 08:34 |显示全部楼层
pnotify->FileName 并不以L'\0'结尾
而你的 getname 却必须以L'\0'结尾
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP