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