目的: 獲悉指定文件夾下文件變動情況(包括文及其子目錄中文件的新增、修改、刪除等事件)
工具: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能提供具體文件的變化信息,但需要更多的配置和管理,自行探索吧。
附一個完整代碼示例