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)
你可能還有興趣知道:

沒有留言:

簡單使用 Openssl 測試指定加密

Photo by  Markus Winkler  on  Unsplash 有時候更換憑證,要測試指定的加密法連線運作是否正常,其中最簡單的方法,便是使用 Openssl 所提供的連線工具即可。 Client 參數   -msg:用16進位顯示所有協議數據包含 hands...

最近三十天熱門文章