CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  硬件/系统

在线请教:我用findfirstchangenotification监视文件夹是否不改变,但我如何知道是该文件夹下哪一个文件的改变谢谢

楼主xingxing78(星星)2004-05-04 09:13:52 在 VC/MFC / 硬件/系统 提问

在线请教:我用findfirstchangenotification监视文件夹是否不改变,但我如何知道是该文件夹下哪一个文件的改变谢谢 问题点数:0、回复次数:2Top

1 楼wwwllg(野蛮人)回复于 2004-05-04 09:34:04 得分 0

//   FileWatch.cpp:   implementation   of   the   CFileWatch   class.  
  //  
  //////////////////////////////////////////////////////////////////////  
   
  #include   "stdafx.h"  
  #include   "WatchFile.h"  
  #include   "FileWatch.h"  
   
  #ifdef   _DEBUG  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]=__FILE__;  
  #define   new   DEBUG_NEW  
  #endif  
   
  //////////////////////////////////////////////////////////////////////  
  //   Construction/Destruction  
  //////////////////////////////////////////////////////////////////////  
   
  CFileWatch::CFileWatch()  
  {  
  hCompPort=NULL;    
  m_bStop   =   true;  
  numDirs   =   0;  
  memset(DirInfo,0,sizeof(DIRECTORY_INFO)*MAX_DIRS);  
  }  
   
  CFileWatch::~CFileWatch()  
  {  
   
  }  
  BOOL   CFileWatch::WatchDirectories(   char   *lpStrpath   )  
  {  
  if(numDirs   >   MAX_DIRS)  
  return   false;  
  DirInfo[numDirs].hDir   =   CreateFile(   lpStrpath,  
  FILE_LIST_DIRECTORY,  
  FILE_SHARE_READ   |  
  FILE_SHARE_WRITE   |  
  FILE_SHARE_DELETE,  
  NULL,  
  OPEN_EXISTING,  
  FILE_FLAG_BACKUP_SEMANTICS   |  
  FILE_FLAG_OVERLAPPED,  
  NULL);  
   
  if(   DirInfo[numDirs].hDir   ==   INVALID_HANDLE_VALUE   )  
  {  
  return   false;  
  }  
          strcpy(   DirInfo[numDirs].lpszDirName,   lpStrpath   );  
  hCompPort=CreateIoCompletionPort(   DirInfo[numDirs].hDir,  
  hCompPort,(DWORD)   &DirInfo[numDirs],0);  
  numDirs   ++;  
  if(m_bStop)  
  {  
          AfxBeginThread(Watch,this);  
  m_bStop   =   !m_bStop;  
  }  
  return   true;  
  }  
  void   CFileWatch::WatchDirectories(   HANDLE   hCompPort   )  
  {  
          DWORD       i;  
  //         DWORD       tid;  
  //         HANDLE     hThread;  
   
   
          //   Start   watching   each   of   the   directories   of   interest  
   
          for   (i=0;i<numDirs;i++)  
          {  
                  if(!ReadDirectoryChangesW(   DirInfo[i].hDir,  
                                                                DirInfo[i].lpBuffer,  
                                                                MAX_BUFFER,  
                                                                TRUE,  
                                                                FILE_NOTIFY_CHANGE_LAST_WRITE,  
                                                                &DirInfo[i].dwBufLength,  
        &DirInfo[i].Overlapped,  
                                                                NULL))  
  {  
  int   tt=GetLastError();  
  }  
          }  
   
          //   Create   a   thread   to   sit   on   the   directory   changes  
   
  CWinThread   *pThread   =     AfxBeginThread(HandleDirectoryChange,(LPVOID)hCompPort);  
  //         hThread   =   CreateThread(   NULL,  
  //                                                         0,  
  //                                                         (LPTHREAD_START_ROUTINE)   HandleDirectoryChange,(LPVOID)  
  //                                                         hCompPort,  
  //                                                         0,  
  //                                                         &tid);  
          WaitForSingleObject(   pThread->m_hThread,   INFINITE   );  
          CloseHandle(   pThread->m_hThread   );  
  }  
  void   CFileWatch::CheckChangedFile(   LPDIRECTORY_INFO   lpdi,  
                                                              PFILE_NOTIFY_INFORMATION   lpfni)  
  {  
  TRACE("test   is   ok\n");  
  /*  
          TCHAR             szFullPathName[MAX_PATH];  
          TCHAR             *p;  
          HANDLE           hFile;  
          FILETIME       LocalFileTime;  
          SYSTEMTIME   SystemTime;  
          BY_HANDLE_FILE_INFORMATION   FileInfo;  
   
          p   =   FileList;  
   
          while(*p   &&   lstrcmpi(p,lpfni->FileName))  
                  p+=(lstrlen(p)+1);  
   
          if(*p)  
          {  
                  lstrcpy(   szFullPathName,   lpdi->lpszDirName   );  
                  lstrcat(   szFullPathName,   L"\\"   );  
                  lstrcat(   szFullPathName,   lpfni->FileName   );  
   
                  //   we   assume   that   the   file   was   changed,   since    
                  //   that   is   the   only   thing   we   look   for   in   this   sample  
                  wprintf(   L"%s   changed,",   szFullPathName   );  
   
                  hFile=CreateFile(   szFullPathName,  
                                                      GENERIC_READ,  
                                                      FILE_SHARE_READ,  
                                                      NULL,  
                                                      OPEN_EXISTING,  
                                                      FILE_FLAG_SEQUENTIAL_SCAN,  
                                                      0);  
   
                  GetFileInformationByHandle(   hFile,   &FileInfo   );  
   
                  FileTimeToLocalFileTime(   &(FileInfo.ftLastWriteTime),   &LocalFileTime   );  
   
                  FileTimeToSystemTime(   &LocalFileTime,   &SystemTime   );  
   
                  wprintf(   L"   Size   =   %d   bytes,",   FileInfo.nFileSizeLow   );  
                  wprintf(   L"   Last   Access   =   %02d/%02d/%02d   %02d:%02d:%02d",  
                                    SystemTime.wMonth,  
                                    SystemTime.wDay,  
                                    SystemTime.wYear,  
                                    SystemTime.wHour,  
                                    SystemTime.wMinute,  
                                    SystemTime.wSecond   );  
   
                  CloseHandle(   hFile   );  
   
                  wprintf(   L"\n"   );  
          }  
  */  
  }  
  UINT   CFileWatch::HandleDirectoryChange(   LPVOID   pParam   )  
  {  
  HANDLE   dwCompletionPort   =     (HANDLE)   pParam;  
  if(dwCompletionPort   ==   NULL)  
  return   0;  
          DWORD   numBytes;  
          DWORD   cbOffset;  
          LPDIRECTORY_INFO   di;  
          LPOVERLAPPED   lpOverlapped;  
          PFILE_NOTIFY_INFORMATION   fni;  
   
          do  
          {  
                  //   Retrieve   the   directory   info   for   this   directory  
                  //   through   the   completion   key  
                  GetQueuedCompletionStatus(   (HANDLE)   dwCompletionPort,  
                                                                        &numBytes,  
                                                                        (LPDWORD)   &di,  
                                                                        &lpOverlapped,  
                                                                        INFINITE);  
  int   tt   =0;  
   
                  if   (   di   )  
                  {  
   
                          fni   =   (PFILE_NOTIFY_INFORMATION)di->lpBuffer;  
   
                          do  
                          {  
                                  cbOffset   =   fni->NextEntryOffset;  
   
                                  if(   fni->Action   ==   FILE_ACTION_MODIFIED   )  
  {  
                                          CheckChangedFile(   di,   fni   );  
  }  
   
                                  fni   =   (PFILE_NOTIFY_INFORMATION)((LPBYTE)   fni   +   cbOffset);  
   
                          }   while(   cbOffset   );  
   
                          //   Reissue   the   watch   command  
                          ReadDirectoryChangesW(   di->hDir,di->lpBuffer,  
                                                                        MAX_BUFFER,  
                                                                        TRUE,  
                                                                        FILE_NOTIFY_CHANGE_LAST_WRITE,  
                                                                        &di->dwBufLength,  
                                                                        &di->Overlapped,  
                                                                        NULL);  
                  }  
   
          }   while(   di   );  
   
  return   0;  
  }  
   
  void   CFileWatch::Reset()  
  {  
   
  }  
   
   
   
  void   CFileWatch::StopWatch()  
  {  
          PostQueuedCompletionStatus(   hCompPort,   0,   0,   NULL   );  
  Reset();  
  }  
   
  UINT   CFileWatch::Watch(LPVOID   pParam)  
  {  
  CFileWatch   *watch   =(CFileWatch*)pParam;  
  if(watch   ==   NULL)  
  return   1;  
  watch->WatchDirectories(watch->hCompPort);  
  return   0;  
   
  }  
  Top

2 楼codewarrior(会思考的草)回复于 2004-06-08 10:00:05 得分 0

或者使用SHChangeNotifyRegister/SHChangeNotifyDeregister.LRESULT   CThumbnailListCtrl::OnFileChanged(WPARAM   wParam,   LPARAM   lParam)  
  {  
  SHNotifyInfo*   pShellInfo   =   (SHNotifyInfo*)wParam;  
   
  if(m_strCurrentDir.IsEmpty())  
  {  
  return   0;  
  }  
   
  switch(lParam)  
  {  
          case   SHCNE_DELETE:  
  {  
  //deleted   file  
  CString   strPathName   =   GetPathFromPIDL(pShellInfo->dwItem1);  
  CString   strPath   =   ExtractPath(strPathName); break;  
  }  
   
  ............  
  }Top

相关问题

  • 监视文件夹
  • 共享文件夹监视
  • 如何监视文件夹的变动?
  • 如何监视指定文件夹下的文件
  • 用FileSystemWatcher类自动监视文件夹中文件的问题??
  • 程序中如何监视某一个文件夹
  • monitor文件夹.
  • 关于监视文件夹和文件描述符的使用问题
  • 怎么样监视多个文件或文件夹的变动啊~~~~~~~
  • 删除文件夹

关键词

  • 文件夹
  • cfilewatch
  • szfullpathname
  • lpfni
  • numdirs
  • 改变
  • fileinfo
  • hfile
  • max
  • share

得分解答快速导航

  • 帖主:xingxing78

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo