跳至主要内容

如何偵測檔案變動

· 閱讀時間約 2 分鐘

前言

我自己在目前部落格上有三種實際應用場景:

  1. Preview 網頁自動 reload:這個場景是高頻檢查,例如每秒看一次檔案有沒有變。就算偶爾誤判,最多只是多 reload 一次,所以我用檔案修改時間來判斷。這邊我用 Polling 的方式來做,雖然 I/O 比較重一點,但實現起來簡單,也不用去安裝其他套件。

  2. Build 建立靜態網站:這邊的重點是正確性,要精準知道內容是否真的改變,避免不必要重建或漏建,所以我會直接比對全文內容,也就是比對「渲染後的文章」與「輸出資料夾的文章」。

  3. 檔案變動後要打 API:打 API 通常有副作用,不能亂觸發。這時候不一定要知道改了哪裡,只要知道內容真的不同即可,所以我會把 Hash 存起來,如果有比對到 Hash 變更再去打 API。這種做法很優雅,不需要多留一份原始檔案,只要保留原檔案的 Hash 值就好了。

三種方法的差異

方法核心概念速度準確度代價
時間戳比對檔案最後修改時間很快可能會誤判
全文比對逐字比較內容需要讀兩份完整檔案
Hash 比對比較最終內容 Hash需額外保存 Hash 值

1. 比較檔案時間

只要看檔案最後修改時間有沒有變,就能快速判斷「可能有變更」。

  • 優點:極快、實作簡單,適合高頻率輪詢。
  • 缺點:有誤判機會,像是改了 metadata、或某些同步工具重寫時間。

2. 全文比對

直接把新舊檔案內容拿來比,這是最準確的方法。

  • 優點:只要內容一樣,就一定判定「沒變」。
  • 缺點:每次都要讀檔和比對,檔案越大越花時間。

3. Hash 比對

做法是先計算檔案 Hash,把它存起來,下次再算一次做比對。

  • 優點:不需要知道改了哪裡,只要知道內容是否不同,速度與儲存成本都不錯。
  • 缺點:仍然要讀取內容計算 Hash;另外需要管理一份本地 Hash 資料。

實務上,若是有副作用的操作(例如打 API、觸發部署、通知、計費),Hash 很適合。