[New - Windows NT]
ReadDirectoryChangesW函数返回描述在目录中发生的更改的信息。
BOOL ReadDirectoryChangesW(
HANDLE 【hDirectory】, | //处理要查看的目录 |
LPVOID 【lpBuffer】, | //指向缓冲区的指针,以接收读取结果 |
DWORD 【nBufferLength】, | // length of 【lpBuffer】 |
BOOL 【bWatchSubtree】, | //监控目录或目录树的标志 |
DWORD 【dwNotifyFilter】, | //过滤条件来监视 |
LPDWORD 【lpBytesReturned】, | //返回的字节数 |
LPOVERLAPPED 【lpOverlapped的】, | //指向重叠I / O所需的结构的指针 |
LPOVERLAPPED_COMPLETION_ROUTINE 【lpCompletionRoutine】 | //指向完成例程的指针 |
); |
参数
【hDirectory】
标识要观看的目录。必须使用FILE_LIST_DIRECTORY访问权限打开此目录。
【lpBuffer】
指定要在其中返回读取结果的格式化缓冲区的地址。该缓冲区的结构由FILE_NOTIFY_INFORMATION结构定义。这个缓冲区可以同步或异步地进行填充,具体取决于目录的打开方式以及给定的【lpOverlapped的】参数的值。有关详细信息,请参阅备注部分。
【nBufferLength】
指定【lpBuffer】参数指向的缓冲区的长度。
【bWatchSubtree】
指定ReadDirectoryChangesW功能是否监视目录或目录树。如果指定为TRUE,则该函数将监视以指定目录为根的目录树。如果指定为FALSE,则该函数仅监视由【hDirectory】参数指定的目录。
【dwNotifyFilter】
指定功能检查以确定等待操作是否已完成的过滤条件。此参数可以是以下值中的一个或多个:
值 | 含义 |
FILE_NOTIFY_CHANGE_FILE_NAME | 监视目录或子树中的任何文件名更改导致更改通知等待操作返回。更改包括重命名,创建或删除文件。 |
FILE_NOTIFY_CHANGE_DIR_NAME | 监视目录或子树中的任何目录名更改导致更改通知等待操作返回。更改包括创建或删除目录。 |
FILE_NOTIFY_CHANGE_ATTRIBUTES | 监视目录或子树中的任何属性更改导致更改通知等待操作返回。 |
FILE_NOTIFY_CHANGE_SIZE | 监视目录或子树中的任何文件大小更改导致更改通知等待操作返回。仅当文件写入磁盘时,操作系统才会检测文件大小的变化。对于使用大量缓存的操作系统,仅当高速缓存充分刷新时才会发生检测。 |
FILE_NOTIFY_CHANGE_LAST_WRITE | 对监视目录或子树中文件的最后一次写入时间的任何更改都会导致更改通知等待操作返回。只有当文件写入磁盘时,操作系统才能检测到最后写入时间的更改。对于使用大量缓存的操作系统,仅当高速缓存充分刷新时才会发生检测。 |
FILE_NOTIFY_CHANGE_LAST_ACCESS | 对监视目录或子树中文件的最后访问时间的任何更改都会导致更改通知等待操作返回。 |
FILE_NOTIFY_CHANGE_CREATION | 对被监视目录或子树中的文件的创建时间的任何更改都会导致更改通知等待操作返回。 |
FILE_NOTIFY_CHANGE_SECURITY | 监视目录或子树中的任何安全描述符更改导致更改通知等待操作返回。 |
【lpBytesReturned】
对于同步调用,此参数指定传输到【lpBuffer】参数的字节数。对于异步调用,此参数未定义。您必须使用异步通知技术来检索传输的字节数。
【lpOverlapped的】
指向OVERLAPPED结构,提供在异步操作期间使用的数据。否则,此值为NULL。不使用此结构的抵消和OffsetHigh成员。
【lpCompletionRoutine】
当操作完成并且调用线程处于可警告的等待状态时,指向要调用的完成例程。有关此完成例程的更多信息,请参阅FileIOCompletionRoutine.
回报值
如果函数成功,返回值不为零。对于同步调用,这意味着操作成功。对于异步调用,这表示操作成功排队。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
要获取目录的句柄,请使用FILE_FLAG_BACKUP_SEMANTICS的CreateFile 函数,如下所示:
hDir = CreateFile (
DirName, //指向文件名的指针
FILE_LIST_DIRECTORY, //访问(读写)模式
FILE_SHARE_READ|FILE_SHARE_DELETE, //共享模式
NULL, //安全描述符
OPEN_EXISTING, //如何创建
FILE_FLAG_BACKUP_SEMANTICS, //文件属性
NULL //具有要复制的属性的文件
);
可以同步或异步地完成对ReadDirectoryChangesW的呼叫。要指定异步完成,请使用CreateFile打开目录,如上所示,但另外在【dwFlagsAndAttributes】参数中指定FILE_FLAG_OVERLAPPED属性。当您致电ReadDirectoryChangesW时,请指定OVERLAPPED结构。
成功同步完成后,【lpBuffer】参数是格式化的缓冲区,写入缓冲区的字节数在【lpBytesReturned】中可用。如果传输的字节数为零,则缓冲区太小,无法提供有关目录或子树中发生的所有更改的详细信息。在这种情况下,您应该通过枚举目录或子树来计算更改。
对于异步完成,您可以通过以下三种方式之一接收通知:
*使用GetOverlappedResult功能。要通过GetOverlappedResult接收通知,请不要在【lpCompletionRoutine】参数中指定完成例程。请务必将OVERLAPPED结构的活动成员设置为唯一的事件。
*使用GetQueuedCompletionStatus 功能。要通过GetQueuedCompletionStatus接收通知,请不要在【lpCompletionRoutine】中指定完成例程。通过调用CreateIoCompletionPort函数将目录句柄【hDirectory】与完成端口相关联。
*使用完成例程。要通过完成例程接收通知,请勿将目录与完成端口相关联。在【lpCompletionRoutine】中指定完成例程。当线程处于可警告的等待状态时,操作完成时调用此例程。系统不使用OVERLAPPED结构的活动成员,因此您可以自己使用它。
也可以看看
CreateFile, CreateIoCompletionPort,FILE_NOTIFY_INFORMATION, FileIOCompletionRoutine, GetOverlappedResult, GetQueuedCompletionStatus, OVERLAPPED