如何偵測檔案變動
· 閱讀時間約 2 分鐘
前言
我自己在目前部落格上有三種實際應用場景:
-
Preview 網頁自動 reload:這個場景是高頻檢查,例如每秒看一次檔案有沒有變。就算偶爾誤判,最多只是多 reload 一次,所以我用檔案修改時間來判斷。這邊我用 Polling 的方式來做,雖然 I/O 比較重一點,但實現起來簡單,也不用去安裝其他套件。
-
Build 建立靜態網站:這邊的重點是正確性,要精準知道內容是否真的改變,避免不必要重建或漏建,所以我會直接比對全文內容,也就是比對「渲染後的文章」與「輸出資料夾的文章」。
-
檔案變動後要打 API:打 API 通常有副作用,不能亂觸發。這時候不一定要知道改了哪裡,只要知道內容真的不同即可,所以我會把 Hash 存起來,如果有比對到 Hash 變更再去打 API。這種做法很優雅,不需要多留一份原始檔案,只要保留原檔案的 Hash 值就好了。
三種方法的差異
| 方法 | 核心概念 | 速度 | 準確度 | 代價 |
|---|---|---|---|---|
| 時間戳 | 比對檔案最後修改時間 | 很快 | 中 | 可能會誤判 |
| 全文比對 | 逐字比較內容 | 慢 | 高 | 需要讀兩份完整檔案 |
| Hash 比對 | 比較最終內容 Hash | 快 | 高 | 需額外保存 Hash 值 |
1. 比較檔案時間
只要看檔案最後修改時間有沒有變,就能快速判斷「可能有變更」。
- 優點:極快、實作簡單,適合高頻率輪詢。
- 缺點:有誤判機會,像是改了 metadata、或某些同步工具重寫時間。
2. 全文比對
直接把新舊檔案內容拿來比,這是最準確的方法。
- 優點:只要內容一樣,就一定判定「沒變」。
- 缺點:每次都要讀檔和比對,檔案越大越花時間。
3. Hash 比對
做法是先計算檔案 Hash,把它存起來,下次再算一次做比對。
- 優點:不需要知道改了哪裡,只要知道內容是否不同,速度與儲存成本都不錯。
- 缺點:仍然要讀取內容計算 Hash;另外需要管理一份本地 Hash 資料。
實務上,若是有副作用的操作(例如打 API、觸發部署、通知、計費),Hash 很適合。