目的: 获悉指定文件夹下文件变动情况(包括文及其子目录中文件的新增、修改、删除等事件)
工具:windows操作系统 pywin32库
pywin32是一个实现win32api的python三方库,使用pip install pywin32进行安装
pywin32包含win32file、win32event、win32con等库,这三个库将在后面用到:
关键函数介绍
1. FindFirstChangeNotification
FindFirstChangeNotification是win32file中的一个函数,作用是设置监听目录及触发条件。
- 第一个参数path_to_watch为想要监听的文件夹绝对路径;
- 第二个函数设置是否监听子目录中的文件变化,0为不监听,1为监听;
- 第三个参数设置监听的变动类型.
函数返回一个句柄。
2. WaitForSingleObject
熟悉windows系统的同学都知道,windows的很多行为基于一套消息机制运作。当某个事件发生后,其标志位置1,对应的事件处理函数获取到"1"后就会开始执行。
WaitForSingleObject就是用于获取某个事件是否发生的api。
- 第一个参数change_habdle为一个句柄,用于指示要等待哪个事件;
- 第二个参数为最长等待时间(ms)
在等待时间内如果目标事件发生(标志位置1)则返回WAIT_OBJECT_0,没发生则返回WAIT_TIMEOUT。
因此通过将监听文件夹的句柄change_handle和等待时间500ms传入WaitForSingleObject函数,再配合while循环对消息进行反复轮询即可实现对文件的监听:
3. FindNextChangeNotification 是什么?
答:FindNextChangeNotification用于更新监听状态。
简单来说就是让监听的文件初始状态更新到当前的文件状态,在当前基础上基于监听有没有新的变化,如果不调用FindNextChangeNotification,会让if条件一直为真。
补充:
FindFirstChangeNotification 这个API仅能获取到目标文件夹内文件发生了变动,但是无法知道具体是哪个文件发生了变动,因此需要额外的代码进行处理。
ReadDirectoryChangeW 这个API能提供具体文件的变化信息,但需要更多的配置和管理,自行探索吧。
附一个完整代码示例