2009-02-13 67 views
1

有沒有更好的方法來檢查文件是否沒有鎖定,然後打開文件來捕獲異常。我有一個filewatcher在一個目錄上運行,我需要在文件完全移動/創建位置之後對文件執行一些操作。不會拋出一個例外的表現嗎?有沒有更好的辦法?檢查文件鎖定沒有嘗試捕獲

Private Function FileAvailable(ByVal fileName As String) As Boolean 
    Try 
     Using inputStream As FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None) 
      Return True 
     End Using 
    Catch ex As IOException 
     Return False 
    End Try 
End Function 

private bool FileAvailable(string fileName) { 
try { 
    using (FileStream inputStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { 
     return true; 
    } 
} 
catch (IOException ex) { 
    return false; 
} 

}

的最佳方式有點高手指教。謝謝

該文件正被複制到監視目錄中。沒有其他用戶可以訪問該目錄。我只需要驗證該文件是否完全複製到我處理並自己移動文件的目錄中。我需要獨家訪問它。

+0

你必須定義'我需要對文件做些什麼'的含義。不同的操作意味着不同的訪問權限,共享權限,... – 2009-02-13 22:32:05

+0

重複的http://stackoverflow.com/questions/1304/checking-for-file-lock-in-c – 2009-02-13 22:37:11

回答

8

你多久會這樣做?把它放在上下文中,假設你每50毫秒檢查一次 - 這是相當頻繁的。我的筆記本電腦(最後一次檢查)能夠拋出超過100個例外每毫秒 ...因此拋出異常的成本將低於總體時間的0.02% - 並且假設它總是很忙!

現在,有一個API可以避免這種情況 - 一種TryOpenFile - 當然不錯,但是如果沒有,我只是把它放在另一個函數中,而不用擔心。

但是請記住,如果您剛剛返回一個布爾值,那麼您的數據只要返回就會過時 - 只要您返回「沒關係,另一個進程就可以獲得排它鎖定」。爲了避免這種情況,您應該考慮返回打開的流。