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
  • 2668

C、C++函数和类库详解(VC++版)

C、C++函数和类库详解(VC++版)(未完成) 整理者:赤子玄心 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联...
  • cyz7758520
  • cyz7758520
  • 2015年11月11日 10:58
  • 6583

Hibernate面试题+答案

篇幅很长,请耐心阅读和学习,希望对你有所帮助!1.下面不属于持久化的是( a) A.把对象转换为字符串的形式通过网络传输,在另一端接收到这个字符串后能把对象还原出来B.把程序数据从数据库中读出来 C....
  • u011225629
  • u011225629
  • 2015年08月28日 20:23
  • 8454

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

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

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

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

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

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

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

from : http://www.ibm.com/developerworks/cn/linux/l-inotifynew/
  • Fybon
  • Fybon
  • 2014年04月05日 20:21
  • 1051

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

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

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

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

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

linux --- inotify 文件系统变化通知机制 在linux下开发过程中,用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,...
  • andyhuabing
  • andyhuabing
  • 2013年06月08日 10:08
  • 6283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化
举报原因:
原因补充:

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