11.15 监控目录文件变化

2023-11-21 20:36
文章标签 变化 监控 目录 11.15

本文主要是介绍11.15 监控目录文件变化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

监视对指定目录的更改,并将有关更改的信息打印到控制台,该功能的实现不仅可以在内核层,在应用层同样可以。程序中使用ReadDirectoryChangesW函数来监视目录中的更改,并使用FILE_NOTIFY_INFORMATION结构来获取有关更改的信息。

ReadDirectoryChangesW 是Windows操作系统提供的一个函数,用于监视目录的变化。它属于Windows API的一部分,主要用于监视文件系统中目录的修改、新增、删除等变化,并通过回调函数向应用程序提供通知。

以下是该函数的声明:

BOOL ReadDirectoryChangesW(HANDLE                hDirectory,LPVOID                lpBuffer,DWORD                 nBufferLength,BOOL                  bWatchSubtree,DWORD                 dwNotifyFilter,LPDWORD               lpBytesReturned,LPOVERLAPPED          lpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

其中:

  • hDirectory:要监视的目录的句柄。
  • lpBuffer:接收变更通知的缓冲区。
  • nBufferLength:缓冲区的大小。
  • bWatchSubtree:如果为 TRUE,则监视目录树中的所有目录。如果为 FALSE,则仅监视指定的目录。
  • dwNotifyFilter:指定要监视的变更类型,可以是文件夹或文件的新增、删除、修改等。
  • lpBytesReturned:返回实际读取到的字节数。
  • lpOverlapped:用于异步操作的 OVERLAPPED 结构。
  • lpCompletionRoutine:指定一个回调函数,在异步操作完成时调用。

在使用这个函数时,通常会在回调函数中处理具体的文件变更信息。ReadDirectoryChangesW通常用于异步操作,因此在调用时需要提供一个OVERLAPPED结构或使用同步的方式等待变更。

如下代码中使用CreateThread函数创建一个线程,并将MonitorFileThreadProc运行起来,此函数使用带有FILE_LIST_directory标志的CreateFile打开指定的目录,该标志允许该函数监视目录。并使用ReadDirectoryChangesW函数读取目录中的更改,传递一个缓冲区来存储更改,并指定要监视的更改类型。

使用WideCharToMultiByte函数将宽字符文件名转换为多字节文件名,并将文件名与目录路径连接以获得文件的完整路径。然后,该功能将有关更改的信息打印到控制台。

#include <stdio.h>
#include <Windows.h>
#include <tlhelp32.h>DWORD WINAPI MonitorFileThreadProc(LPVOID lParam)
{char *pszDirectory = (char *)lParam;BOOL bRet = FALSE;BYTE Buffer[1024] = { 0 };FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;DWORD dwByteReturn = 0;HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);if (INVALID_HANDLE_VALUE == hFile)return 1;while (TRUE){ZeroMemory(Buffer, sizeof(Buffer));// 设置监控目录回调函数bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE,FILE_NOTIFY_CHANGE_FILE_NAME |      // 修改文件名FILE_NOTIFY_CHANGE_ATTRIBUTES |     // 修改文件属性FILE_NOTIFY_CHANGE_LAST_WRITE,      // 最后一次写入&dwByteReturn, NULL, NULL);if (TRUE == bRet){char szFileName[MAX_PATH] = { 0 };// 将宽字符转换成窄字符,宽字节字符串转多字节字符串WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,(pBuffer->FileNameLength / 2),szFileName,MAX_PATH,NULL,NULL);// 将路径与文件连接成完整文件路径char FullFilePath[1024] = { 0 };strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));strcat(FullFilePath, szFileName);switch (pBuffer->Action){case FILE_ACTION_ADDED:{printf("添加: %s \n", FullFilePath); break;}case FILE_ACTION_REMOVED:{printf("删除: %s \n", FullFilePath); break;}case FILE_ACTION_MODIFIED:{printf("修改: %s \n", FullFilePath); break;}case FILE_ACTION_RENAMED_OLD_NAME:{printf("重命名: %s", szFileName);if (0 != pBuffer->NextEntryOffset){FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)((DWORD)pBuffer + pBuffer->NextEntryOffset);switch (tmpBuffer->Action){case FILE_ACTION_RENAMED_NEW_NAME:{ZeroMemory(szFileName, MAX_PATH);WideCharToMultiByte(CP_ACP,0,tmpBuffer->FileName,(tmpBuffer->FileNameLength / 2),szFileName,MAX_PATH,NULL,NULL);printf(" -> %s \n", szFileName);break;}}}break;}case FILE_ACTION_RENAMED_NEW_NAME:{printf("重命名(new): %s \n", FullFilePath); break;}}}}CloseHandle(hFile);return 0;
}int main(int argc, char * argv[])
{char *pszDirectory = "C:\\";HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL);WaitForSingleObject(hThread, INFINITE);CloseHandle(hThread);return 0;
}

运行后监控C盘所有文件的变化,并输出如下信息;

这篇关于11.15 监控目录文件变化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404942

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(