Python实现Windows下文件监听


3楼猫 发布时间:2024-12-24 23:51:45 作者:一个小号。 Language

目的:  获悉指定文件夹下文件变动情况(包括文及其子目录中文件的新增、修改、删除等事件)

工具:windows操作系统  pywin32库

pywin32是一个实现win32api的python三方库,使用pip install pywin32进行安装

pywin32包含win32file、win32event、win32con等库,这三个库将在后面用到:

Python实现Windows下文件监听-第0张

关键函数介绍 

1. FindFirstChangeNotification

Python实现Windows下文件监听-第1张

FindFirstChangeNotification是win32file中的一个函数,作用是设置监听目录及触发条件。

  • 第一个参数path_to_watch为想要监听的文件夹绝对路径;
  • 第二个函数设置是否监听子目录中的文件变化,0为不监听,1为监听;
  • 第三个参数设置监听的变动类型.

函数返回一个句柄。

2. WaitForSingleObject

熟悉windows系统的同学都知道,windows的很多行为基于一套消息机制运作。当某个事件发生后,其标志位置1,对应的事件处理函数获取到"1"后就会开始执行。

Python实现Windows下文件监听-第2张

WaitForSingleObject就是用于获取某个事件是否发生的api。

  • 第一个参数change_habdle为一个句柄,用于指示要等待哪个事件;
  • 第二个参数为最长等待时间(ms)

在等待时间内如果目标事件发生(标志位置1)则返回WAIT_OBJECT_0,没发生则返回WAIT_TIMEOUT。

因此通过将监听文件夹的句柄change_handle和等待时间500ms传入WaitForSingleObject函数,再配合while循环对消息进行反复轮询即可实现对文件的监听:

Python实现Windows下文件监听-第3张

3. FindNextChangeNotification 是什么?

答:FindNextChangeNotification用于更新监听状态。

简单来说就是让监听的文件初始状态更新到当前的文件状态,在当前基础上基于监听有没有新的变化,如果不调用FindNextChangeNotification,会让if条件一直为真。

补充:

FindFirstChangeNotification 这个API仅能获取到目标文件夹内文件发生了变动,但是无法知道具体是哪个文件发生了变动,因此需要额外的代码进行处理。

ReadDirectoryChangeW 这个API能提供具体文件的变化信息,但需要更多的配置和管理,自行探索吧。

附一个完整代码示例

Python实现Windows下文件监听-第3张

© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com