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盘所有文件的变化,并输出如下信息;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium中元素定位方法详细介绍

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

JavaScript实现飞机发射子弹详解(内含源码)

JavaScript实现飞机发射子弹 前言实现过程源码展示源码讲解HTML结构CSS结构js结构 前言 文本主要讲解如何利用JavaScript实现飞机发射子弹&#xff0c;实现过程以及源码讲解。实现效果图如下&#xff1a; 实现过程 首先&#xff0c;找到飞机和子弹的UI图&#xff0c;gif图最…

外贸B2C独立站如何做?

外贸B2C独立站是一种直接向海外消费者销售产品的商业模式。它通常包括建立一个自己的在线商店&#xff0c;通过社交媒体、广告和搜索引擎等渠道吸引流量&#xff0c;并使用国际支付和物流服务来处理订单。以下是一些关于如何建立和运营外贸B2C独立站的建议&#xff1a; 确定目标…

【Android】使用Retrofit2发送异步网络请求的简单案例

添加网络权限到AndroidManifest.xml清单文件 为了让你的Android应用程序能够使用互联网进行通信&#xff0c;你需要在AndroidManifest.xml文件中添加网络权限声明。<uses-permission android:name"android.permission.INTERNET"/> 这个权限应该添加到 Android…

C/C++模板类模板与函数模板区别,以及用法详解

类模板 类模板语法 类模板作用&#xff1a; 建立一个通用类&#xff0c;类中的成员 数据类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语法&#xff1a; template<typename T> 类解释&#xff1a; template --- 声明创建模板 typename --- 表面其后面的…

python爬虫概述及简单实践:获取豆瓣电影排行榜

目录 前言 Python爬虫概述 简单实践 - 获取豆瓣电影排行榜 1. 分析目标网页 2. 获取页面内容 3. 解析页面 4. 数据存储 5. 使用代理IP 总结 前言 Python爬虫是指通过程序自动化地对互联网上的信息进行抓取和分析的一种技术。Python作为一门易于学习且强大的编程语言&…

云服务器网络掉包问题分析及解决方案

在互联网领域拥有先进的基础设施和技术&#xff0c;其服务器网络一直以来都备受关注。近期有用户反映云服务器网络掉包问题严重&#xff0c;给用户的网络体验带来了很大的困扰。 我们需要了解什么是网络掉包。网络掉包是指在数据传输过程中&#xff0c;由于网络拥堵、路由不稳…

LabVIEW关于USRPRIO的示例代码

LabVIEW关于USRPRIO的示例代码 USRPRIO 通常以两种方式使用&#xff1a; 1 基于 FPGA 的编程 对于希望修改USRP上的底层FPGA代码以添加自定义DSP模块的应用&#xff0c;请使用USRP示例项目。它可作为构建 USRP RIO 流式处理应用程序的起点&#xff0c;可从“创建项目”对话框…

项目资讯丨轻空间中标连云港市首座“多功能声学综合馆”(EPC)

近日&#xff0c;轻空间&#xff08;江苏&#xff09;膜科技有限公司&#xff08;以下简称“轻空间”&#xff09;成功中标连云港市首座“多功能声学综合馆”项目&#xff0c;这标志着轻空间在新型气膜领域的创新突破技术&#xff0c;再次获得政府机构的高度认可&#xff0c;为…

vue 鼠标移入移出事件执行多次(尤其ie)

mouseover 当一个定点设备&#xff08;通常指鼠标&#xff09;在一个元素本身或者其子元素上移动时&#xff0c;mouseover 事件在该元素上触发。 mouseenter 事件在定点设备&#xff08;通常指鼠标&#xff09;首次移动到元素的激活区域内时&#xff0c;在该元素上触发。 mouse…

TypeScript 泛型及应用

TypeScript 泛型及应用 泛型&#xff08;Generics&#xff09;是 TypeScript 中的一项强大特性&#xff0c;它允许我们在定义函数、类和接口时使用类型参数&#xff0c;从而增加代码的灵活性和重用性。本文将介绍 TypeScript 中泛型的概念、语法以及一些常见的应用场景。 泛型…

IntelliJ IDEA 快捷键 Windows 版本

前言&#xff1a;常用快捷键 IntelliJ IDEA编辑器大受欢迎的原因之一是它的智能提示和丰富的快捷键&#xff0c;在日常开发中熟练的使用快捷键会大大提升开发的效率&#xff0c;本篇文章就笔者日常开发中的总结&#xff0c;把常用的、好用的快捷键做一个列表&#xff0c;方便…

Docker 中 jdk8容器里无法使用 JDK 的 jmap 等命令的问题

一、问题描述 项目部署在 CentOS 服务器上。项目偶尔会出现无响应的情况&#xff0c;这时理所当然要上去用 JDK 相关命令看看堆栈和GC等信息了。 进入 Java 程序所在容器&#xff1a;docekr-compose exec api bash&#xff0c;进入到 api 容器的 bash 终端。 jps 打印 Java …

水声功率放大器在声呐系统中的应用有哪些

水声功率放大器在声呐系统中扮演着重要的角色&#xff0c;其应用涵盖了声呐系统的多个方面。下面就让安泰电子来介绍水声功率放大器在声呐系统中的应用。 发射声波信号&#xff1a;声呐系统通过发射声波信号并接收其回波来探测和测量海洋中的目标物体。水声功率放大器用于放大发…

划片机新手教程:从准备工作到注意事项全解析!

随着科技的飞速发展&#xff0c;划片机已成为半导体行业不可或缺的一部分。对于新手来说&#xff0c;如何正确操作划片机显得尤为重要。以下是新手操作划片机的步骤和建议。 一、准备工作 在开始操作划片机之前&#xff0c;首先需要准备好以下工具和材料&#xff1a; 1. 划片机…

CICD 持续集成与持续交付——gitlab

部署 虚拟机最小需求&#xff1a;4G内存 4核cpu 下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装依赖性 [rootcicd1 ~]# yum install -y curl policycoreutils-python openssh-server perl[rootcicd1 ~]# yum install -y gitlab-ce-15.9.3-ce.0…

SQL常见函数整理 —— lead()向下偏移

1. 用法 是在窗口函数中使用的函数&#xff0c;它用于获取当前行的下一行&#xff08;后一行&#xff09;的某个列的值。具体来说&#xff0c;LEAD() 函数可用于查找任何给定行的下一行&#xff08;后一行&#xff09;的值&#xff0c;同时也可控制行数偏移量&#xff08;offse…

创建自定义日志筛选器

Windows的事件查看器中的日志包含了很多信息&#xff0c;但是系统自带的筛选器只能筛选固定的字段和内容。有时候想根据某个事件中的用户名或者IP筛选的时候就没办法了。此时需要创建自定义筛选器来实现。 首先找到希望筛选的日志&#xff0c;调整成详细的XML视图。 这里面就有…

WhatsApp新营销全解:出海新个体,能不能做好WhatsApp营销

对于很多外贸跨境群体来说&#xff0c;很多时候是单打独斗的新个体运营模式&#xff0c;团队成员数量一两个人。然而&#xff0c;正是这一两个人的运营团队&#xff0c;在运营的时候不仅有四两拨千斤的能力&#xff0c;还能做到十八般武艺全能。 他们在运营设计和实操环节&…

手写promis(1)

目录 前言 核心功能--构造函数 核心功能--状态及原因 then方法 成功和失败回调 异步及多次调用 异步任务--核心api Promise.then: queueMicrotask: MutationObserver: setImmediate: setTimeout: 异步任务---函数封装 前言 Promise&#xff08;承诺&#xff09;…