2009-08-22 61 views
4

有沒有什麼辦法可以在試圖打開文件之前先測試一個文件是否正在使用?如何檢查文件是否正在使用?

try 
{ 
    FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read); 
} 
catch (IOException ex) 
{ 
    // ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process." 
} 

我看着周圍的一切,我能找到的最好是執行某種:例如,如果該文件仍然被寫入或使用被認爲是這個代碼塊將拋出一個異常用一個試圖捕捉裏面的投票,那感覺所以哈克。我希望那裏有System.IO.FileInfo,但沒有。

任何想法更好的方法?

回答

4

「你可以通過P調用鎖文件API函數/直接調用層。你會使用由上的FileStream的SafeFileHandle屬性返回的句柄。 調用API直接將允許你檢查返回值的錯誤情況,而不是訴諸於異常。「

的try/catch塊是正確的解決方案(雖然你想捕獲IOException異常,並非所有的例外)。有沒有辦法可以正確同步,因爲測試鎖+獲取鎖不是原子操作「。

記住,文件系統是揮發性的:僅僅因爲你的文件是一個狀態一個操作並不意味着它會成爲下一個操作相同的狀態你必須要能。處理來自文件系統的異常。「

Using C# is it possible to test if a lock is held on a file

http://www.dotnet247.com/247reference/msgs/32/162678.aspx

+0

我並不關心它是原子。該鏈接提到可以通過P/Invoke進行檢查。我在哪裏可以找到更多的信息,看看它是否有幫助? – mckamey 2009-08-22 02:43:51

+0

@McKAMEY:檢查我剛添加的第二個鏈接。 – cakeforcerberus 2009-08-22 03:22:35

+0

由於文件系統的改變總是可能的,所以正確的答案是嘗試它並處理髮生的異常。此外,簡單地詢問它比跳過箍環查明是否正在使用更容易。 – 2009-08-22 03:45:33

0

那麼這會嘗試做只會嘗試在一個循環中捕捉功能。就像數據庫一樣,找出如果你可以做的事情的最好方法就是嘗試去做。如果失敗了,就處理它。除非您的線程代碼關閉,否則沒有理由讓您的程序不能打開文件,除非用戶在另一個程序中打開它。

除非你正在做有趣的事情。

+0

我試圖做有趣的事情:)在我的具體情況下,這些可以是長時間運行的鎖,我想不支付嘗試在循環中的價格。偶爾是好的,但它比特殊情況可能更常見。 – mckamey 2009-08-22 02:43:02

相關問題