C# 如何偵測特定檔案是否為 Lock狀態

要怎樣才能有效在 Windows平台上偵測出檔案是被 Lock呢?


這樣的問題常常會在整合 Office時遇到,像是要依照排程開啟 EXCEL檔案,並透過內含的 VBA運算產出報表。但若是中途發生異常或是中斷,會讓 EXCEL檔案開啟著而導致下次排程無法正常開啟檔案。

為了解決此問題,網路上多半的解法都是先試圖去開檔案,當檔案無法正常開啟時就視同檔案被 Lock住。但是這樣的作法不算精確,因為有很多情況下都會發生開檔錯誤,不一定是因為檔案已被開啟的關係

依照 MSDN,找到一個比較正確的方式,是透過 Mashal.GetHRForException方法取得 HRESULT,接著將 HRESULT跟 65535做 AND運算取得對應 error code,這樣就可正確得知檔案狀態。

若 error code為 32或 33則表示檔案被Lock住,反之則是正常狀態。(HRESULT的定義前面十六個 bits為 error code,取得之 HRESULT 結果還要與 65535做 AND運算才能取出error code)
  • ERROR_SHARING_VIOLATION (error code 32)
  • ERROR_LOCK_VIOLATION(error code 33)
你可能還有興趣知道:

沒有留言:

為什麼檔名千萬別留白?來自鍵盤「空白鍵」的隱形殺手

 平常在電腦裡存檔案時,會不會習慣這樣命名: 2026 出國旅遊 行程表.docx 大專案 最終版 真的最後版.psd 在檔名裡加個「空白鍵」,讓字和字之間有呼吸的空間,看起來清爽又好讀,對吧? 但電腦底層的系統、工程師的眼裡,這個小小的「空白字元」,其實是一個隨時會引爆的炸彈!...

最近三十天熱門文章