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

转载 2013年12月05日 11:27:37

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());      }  }

转自:http://blog.csdn.net/zhaoyawei/article/details/742276

相关文章推荐

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

FindFirstChangeNotification ...

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

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

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 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬...

FSO文件系统对象方法

  • 2016年10月14日 10:13
  • 756KB
  • 下载

对象型文件系统设计

  • 2014年11月25日 20:12
  • 285KB
  • 下载

Hadoop分布式文件系统和OpenStack对象存储有何不同?

最近在Quora上有人提到一个问题,有关Hadoop分布式文件系统和OpenStack对象存储的不同。 问题原文如下: “HDFS (Hadoop分布式文件系统)和OpenStack对象存储(Op...

Linux 对象存储文件系统的研究

随着高性能计算由传统的主机方式向网络化集群演变,传统的基于主机的存储架构已逐渐向网络化存储发展,计算和存储分离的趋势越来越明显。针对 SAN 和 NAS 的不足,国际上已开展针对 Linux 集群...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转)FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化
举报原因:
原因补充:

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