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

沒有留言:

「專業」就是連麻瓜都聽得懂的話術

 『 麻瓜 (英語:Muggle),在J·K·羅琳的《哈利波特》系列小說及電影中是泛指沒有任何魔法能力的人,也不是出生於魔法家庭的人。麻瓜也可以被描述為體內沒有任何魔法血統的人。』 Photo by Vitolda Klein on Unsplash 「你不是工程師,我很難跟你...

最近三十天熱門文章