首页 > 系统相关 >Windows编程:文件监控

Windows编程:文件监控

时间:2023-05-31 17:23:26浏览次数:38  
标签:监控 更改 Windows 编程 或子 NOTIFY FILE 树中 目录

最近在做虚拟打印机时,需要实时监控打印文件的到达,并移动文件到另外的位置。一开始我使用了线程,在线程里去检测新文件的到达。实际上Windows提供了一个文件监控接口函数ReadDIrectoryChangesW。这个函数可以对所有文件操作进行监控。

 

ReadDirectoryChangesW

函数声明

 1 BOOL ReadDirectoryChangesW(
 2   [in]                HANDLE                          hDirectory,
 3   [out]               LPVOID                          lpBuffer,
 4   [in]                DWORD                           nBufferLength,
 5   [in]                BOOL                            bWatchSubtree,
 6   [in]                DWORD                           dwNotifyFilter,
 7   [out, optional]     LPDWORD                         lpBytesReturned,
 8   [in, out, optional] LPOVERLAPPED                    lpOverlapped,
 9   [in, optional]      LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
10 );

 

参数

hDirectory

指向要监听的目录句柄,必须使用FILE_LIST_DIRECTORY访问权限打开此目录。

 

lpBuffer

指向要读取DWORD对齐结果的格式化缓冲区的指针。该缓冲区的结构由FILE_NOTIFY_INFORMATION结构定义

 

nBufferLength

lpBuffer参数指向的缓冲区大小

 

bWatchSubtree

 指示是否以指定目录为根目录进行监控。

True:监视以指定目录为根的目录树

FALSE:仅监视指定目录

 

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

 

lpConpletionRoutine

指向完成例程的指针,当操作已经完成或取消,并且调用线程处于可警告的等待状态时才会调用它

 

返回值

成功:不为0

失败:0

 

监控指定目录下的文件创建

假设我这里要监控D:\PrintFiles目录下的文件更改,操作如下:

打开目录,获取文件句柄

1     // 打开目录, 获取文件句柄
2     HANDLE hDirectory = ::CreateFile(L"D:\\PrintFiles", FILE_LIST_DIRECTORY,
3         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
4         FILE_FLAG_BACKUP_SEMANTICS, NULL);
5     if (INVALID_HANDLE_VALUE == hDirectory)
6     {
7         return 0;
8     }

 

调用ReadDirectoryChangesW监控文件夹

我这里只演示同步调用,异步调用可以参考MSDN文档。同步调用时,如果监控的目录未发生更改,会一直阻塞在那里。

 

 

 

参考资料:

https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw?redirectedfrom=MSDN

标签:监控,更改,Windows,编程,或子,NOTIFY,FILE,树中,目录
From: https://www.cnblogs.com/zhaotianff/p/17446791.html

相关文章

  • 5.portainer与容器监控
    9.portainer9.1.介绍官网:https://www.portainer.io/Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。9.2.安装dockerrun-d-p8000:8000-p9000:9000--nameportainer--restart=always-v/var/run/docker.s......
  • ORACLE 并行度监控 19c
    oracle并行度查看通过v$resource_limit中的parallel_max_servers参数来设置初始值官方对于parallel_max_servers参数设置parallel_max_servers=PARALLEL_THREADS_PER_CPU*CPU_COUNT*concurrent_parallel_users*5Intheformula,thevalueassignedtoconcurrent......
  • windows与linux批处理脚本
    有一个windows下的bat脚本,希望丢到linux下去执行。主要是有一些字符要修改1.文件目录一个是‘\’,一个是‘/’2.使用./命令调用可执行文件3.使用vim编辑器,先输入:ff(fileformat的缩写),会显示文件是dos格式,输入:ff=unix,改为unix格式 ......
  • 如何通过手机远程监控PLC并接收故障报警信息
    PLC在自动化生产制造中应用越来越广泛,对其进行监控和管理的需求也越来越高。以前,我们想要看到现场设备的实时数据,必须在控制室内通过工控机、电脑、触摸屏等这些上位机设备才能看到,同理PLC维护也需要工程师在现场进行编程调试工作,非常不方便。 在工业物联网技术的支持下,我们可以随......
  • 在 Windows 磁盘管理中,RAID 技术主要有四种常见的级别
    独立磁盘冗余阵列(RAID)是一种通过组合多个物理磁盘来创建一个更大、更可靠的逻辑磁盘的技术。RAID通常用于在磁盘级别上提供数据冗余,以增加数据的可靠性和可用性,同时还可以提供更快的读写速度。下面是几种常见的RAID级别:RAID0:将两个或多个磁盘组合成一个大容量的逻辑卷,并将......
  • 网络Socket编程及实例
    1TCP和UDP介绍在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次。1.1 网络体系结构 协议:控制网络中信息的发送和接收。定义了通信实体之间交换报文的格式和次序,以及在报文传输或接收或其他事件所采取的动作。一般把网络的层次结构和每层所使用协议的集合称为网络......
  • 如何进行技术性操作实现监控视频资源的汇聚融合
    如何进行技术性操作实现监控视频资源的汇聚融合一、事件背景随着各行业数字化转型的不断推进,视频监控技术在行业内的安防应用及管理支撑日渐增多,但因前期规划不清晰、管理不到位等问题,视频监管系统普遍存在以下问题:1、各部门单位在视频平台建设中以所属领域为单位,系统孤立分散、统......
  • Windows密码抓取的四种方式
    Windows密码抓取的四种方式一、SAM离线抓取1、通过reg命令无工具导出,然后下载到本地用mimikatz读取用户NTLMHashregsavehklm\samsam.hiveregsavehklm\systemsystem.hive2、通过nishang中的Copy-VSS进行复制(1)在CS中导入模块powershell-import./powershell/Copy-VSS......
  • RabbitMQ在Windows下设置服务启动
    1.管理员模式运行  cmd 2.进入RabbitMQ安装目录下的sbin目录   输入命令: cdrabbitMQ的sbin路径,进入sbin目录输入命令:rabbitmq-service.batinstall进入服务,开启rabbitMQ服务 ......
  • windows下安装多个Redis实例
     1.复制配置: redis.windows-service.conf为redis.windows-service-6380.conf2.更改配置: 如端口/密码等3.安装实例:cdC:\ProgramFiles\Redis&&redis-server.exe--service-installredis.windows-service-6380.conf--service-nameRedis6380--port63804.启动实......