FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化

原创 2006年05月17日 11:12:00

FindFirstChangeNotification

VB声明
Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
说明
创建一个文件通知对象。该对象用于监视文件系统发生的变化
返回值
Long,如成功,返回一个改变通知对象的句柄;INVALID_HANDLE_VALUE表示失败。会设置GetLastError
参数表
参数 类型及说明
lpPathName String,要监视的目录
bWatchSubtree Long,如果为TRUE,表示监视lpPathName的所有子目录
dwNotifyFilter Long,带有前缀FILE_NOTIFY_CHANGE_???前缀的一个或多个常数,它们指定了对象发出信号的条件
注解

FindCloseChangeNotification函数关闭句柄,不要用CloseHandle函数

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>

void RefreshDirectory(LPTSTR);
void RefreshTree(LPTSTR);

void WatchDirectory(LPTSTR lpDir)
{
   DWORD dwWaitStatus; 
   HANDLE dwChangeHandles[2]; 
   TCHAR lpDrive[4];
   TCHAR lpFile[_MAX_FNAME];
   TCHAR lpExt[_MAX_EXT];

   _tsplitpath(lpDir, lpDrive, NULL, lpFile, lpExt);

   lpDrive[2] = (TCHAR)'//';
   lpDrive[3] = (TCHAR)'/0';
 
// Watch the directory for file creation and deletion. 
 
   dwChangeHandles[0] = FindFirstChangeNotification( 
      lpDir,                         // directory to watch 
      FALSE,                         // do not watch subtree 
      FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes 
 
   if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
      ExitProcess(GetLastError()); 
 
// Watch the subtree for directory creation and deletion. 
 
   dwChangeHandles[1] = FindFirstChangeNotification( 
      lpDrive,                       // directory to watch 
      TRUE,                          // watch the subtree 
      FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir. name changes 
 
   if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) 
      ExitProcess(GetLastError()); 
 
// Change notification is set. Now wait on both notification 
// handles and refresh accordingly. 
 
   while (TRUE) 
   { 
   // Wait for notification.
 
      dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, 
         FALSE, INFINITE); 
 
      switch (dwWaitStatus) 
      { 
         case WAIT_OBJECT_0: 
 
         // A file was created or deleted in the directory.
         // Refresh this directory and restart the notification.
 
            RefreshDirectory(lpDir); 
            if ( FindNextChangeNotification( 
                    dwChangeHandles[0]) == FALSE ) 
                ExitProcess(GetLastError()); 
            break; 
 
         case WAIT_OBJECT_0 + 1: 
 
         // A directory was created or deleted in the subtree.
         // Refresh the tree and restart the notification.
 
            RefreshTree(lpDrive); 
            if (FindNextChangeNotification( 
                    dwChangeHandles[1]) == FALSE) 
                ExitProcess(GetLastError()); 
            break; 
 
        default: 
            ExitProcess(GetLastError()); 
      }
   }
}

void RefreshDirectory(LPTSTR lpDir)
{
   _tprintf(TEXT("Refresh the directory (%s)./n"), lpDir);
}

void RefreshTree(LPTSTR lpDrive)
{
   _tprintf(TEXT("Refresh the directory tree (%s)./n"), lpDrive);
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
from msdn:
Monitoring Changes in a Directory or Directory Tree
The following example monitors the directory tree starting at C:/ for directory name changes. It also monitors the C:/WINDOWS directory for file name changes. 

The example uses the FindFirstChangeNotification function to create two notification handles and the WaitForMultipleObjects function to wait on the handles. Whenever a directory is created or deleted in the tree starting at C:/ , the example updates the entire directory tree. Whenever a file is created or deleted in the C:/WINDOWS directory, the example refreshes the WINDOWS directory. The FindNextChangeNotification function restarts the change notification each time the example processes a change. 

DWORD dwWaitStatus; 
HANDLE dwChangeHandles[2]; 
 
// Watch the C:/WINDOWS directory for file creation and 
// deletion. 
 
dwChangeHandles[0] = FindFirstChangeNotification( 
    "C://WINDOWS",                 // directory to watch 
    FALSE,                         // do not watch the subtree 
    FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes 
 
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
    ExitProcess(GetLastError()); 
 
// Watch the C:/ subtree for directory creation and 
// deletion. 
 
dwChangeHandles[1] = FindFirstChangeNotification( 
    "C://",                        // directory to watch 
    TRUE,                          // watch the subtree 
    FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir. name changes 
 
if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) 
    ExitProcess(GetLastError()); 
 
// Change notification is set. Now wait on both notification 
// handles and refresh accordingly. 
 
while (TRUE) 

 
    // Wait for notification.
 
    dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, 
        FALSE, INFINITE); 
 
    switch (dwWaitStatus) 
    { 
        case WAIT_OBJECT_0: 
 
        // A file was created or deleted in C:/WINDOWS. 
        // Refresh this directory and restart the 
        // change notification. RefreshDirectory is an 
        // application-defined function. 
 
            RefreshDirectory("C://WINDOWS") 
            if ( FindNextChangeNotification( 
                    dwChangeHandles[0]) == FALSE ) 
                ExitProcess(GetLastError()); 
            break; 
 
        case WAIT_OBJECT_0 + 1: 
 
        // A directory was created or deleted in C:/. 
        // Refresh the directory tree and restart the 
        // change notification. RefreshTree is an 
        // application-defined function. 
 
            RefreshTree("C://"); 
            if (FindNextChangeNotification( 
                    dwChangeHandles[1]) == FALSE) 
                ExitProcess(GetLastError()); 
            break; 
 
        default: 
            ExitProcess(GetLastError()); 
    } 

相关文章推荐

windows下文件的监控--ReadDirectoryChangesW函数的使用

最近在做一个项目,其中涉及到监控指定目录下所有文件和子目录内的修改信息。经过一番努力,总算实现这一功能,在此特别感谢那些帮助过我的朋友和同事们。今天整理一下这几天的收获,列出相关的知识点,供后来者参考...
  • lvwx369
  • lvwx369
  • 2014年12月23日 14:11
  • 2488

理解 ReadDirectoryChangesW

理解 ReadDirectoryChangesW 原作者:Jim Beveridge 原文:http://qualapps.blogspot.com/2010/05/understanding-...
  • wzsy
  • wzsy
  • 2011年08月18日 11:24
  • 9295

理解 ReadDirectoryChangesW

理解 ReadDirectoryChangesW 原作者:Jim Beveridge 原文:http://qualapps.blogspot.com/2010/05/understanding-...

API函数导航(四)

             四、内核库函数(1)Kernel32.exe    函数名称                             说明AddAtom                   ...
  • Augusdi
  • Augusdi
  • 2010年09月07日 08:24
  • 1828

(转)FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化

FindFirstChangeNotification VB声明 Declare Function FindFirstChangeN...
  • gxj1680
  • gxj1680
  • 2013年12月05日 11:27
  • 923

文件夹监视及文件删除的简易方法

文件夹监视及文件删除的简易方法这几天学习了一些关于文件的操作,在这里做个总结。  我想实现这样的功能:当特定的文件夹Pic当检测到有文件(保证传进来的是图片)进来时,得到该文件的绝对路径,并把它传入v...
  • I_code
  • I_code
  • 2011年03月03日 13:08
  • 2636

inotify -- Linux 2.6 内核中的文件系统变化通知机制

一、 引言 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬...

inotify -- Linux 2.6 内核中的文件系统变化通知机制

一、 引言 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设...

linux --- inotify 文件系统变化通知机制

linux --- inotify 文件系统变化通知机制 在linux下开发过程中,用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,...

notify -- Linux 2.6 内核中的文件系统变化通知机制

一、 引言 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化
举报原因:
原因补充:

(最多只允许输入30个字)