2012-03-26 61 views
3

我正在編寫一些代碼作爲打開文件的框架的一部分。該文件是自定義類型,不應該由我的應用程序的多個實例打開。要停止打開多個文件,我使用文件流來創建鎖定文件,然後保持所述文件流打開。當網絡丟失時在網絡上使用FileStream

這似乎在阻止我的應用程序的另一個實例打開文件(因爲它將無法在文件打開代碼中重新創建鎖定流),但是如果該文件位於網絡共享上並且網絡丟失,那麼原來的應用程序也無法再訪問該文件。

的代碼來獲取鎖流如下:

Try 
     ' We need to keep this stream alive to prevent other applications gaining access to the lock 
     mLockStream = New FileStream(mLockPath, FileMode.CreateNew, FileAccess.Write, FileShare.None) 
    Catch ex As UnauthorizedAccessException 
    Catch ex As DirectoryNotFoundException 
     Throw 
    Catch ex As IOException 
     Throw New ProjectInUseException(My.Resources.LocalizedResources.ProjectInUseExceptionMessage, Nothing) 
    End Try 

在此我創建鎖流第一次圓,然後,如果其他應用程序試圖創建它,它拋出一個異常,並阻止它們從進一步得到。不幸的是,正如我所說的,如果這是通過網絡完成的,然後網絡連接由於某種原因而被丟棄,那麼我不能刪除鎖定流,因爲我得到一個IOException,告訴我一個進程不能在另一個進程中打開該文件(這不應該發生,我不認爲)。

我希望這是有道理的,我環顧四周,但沒有發現任何關於這種特殊場景的內容,所以我想我會看看這裏的任何人是否有過類似的經歷。

歡呼聲。

+0

你應該發佈你的答案*作爲答案*,而不是編輯你的題。我已經爲你做了這件事,並將*我的*答案標記爲社區wiki(所以我沒有爲它贏得聲譽)。也就是說,如果你發佈你的答案,你可以接受它,然後我會刪除我的答案(如果答案是好的/正確的/正確的,你可以在你的答案上投票)。 – casperOne 2012-03-26 17:51:11

+0

您是否介意複製答案並選擇答案?我的回答(以你的名義)不應該在這裏擺在首位。一旦你發佈了答案,我可以刪除我的(這是你的名字)。你的答案應該是*你的*名字。 – casperOne 2013-04-10 12:32:30

回答

0

因此,我花了很多時間,假設問題是深深的,可怕的.Net事情時,事實上修復比我想象的容易一點。我將初始流創建更改爲使用FileShare.Read。在仔細檢查FileShare枚舉後,我發現FileShare.None拒絕了創建它的進程的開放訪問(

拒絕共享當前文件。任何打開文件的請求(通過此進程或其他進程)將直到文件關閉爲止

因此,通過將其更改爲FileShare.Read,可以在重新建立網絡連接時重新獲取鎖定,然後在刪除實際文件之前正確處理它。

我希望這不是太亂碼,對其他人有用。與我的大部分編程問題一樣,這是一個比我預期的問題更簡單的例子,並且把我扔掉了它的蹤跡:)

2

Answer by Dracanus


所以我花了很多時間假設的問題是一些深層次的,黑暗的可怕的.Net的事情時,其實修復比我想象的更容易一些。我將初始流創建更改爲使用FileShare.Read。在進一步檢查FileShare枚舉後,我發現FileShare.None拒絕創建它的進程的開放訪問(

拒絕共享當前文件任何請求打開文件(通過此進程或其他進程這一更改爲FileShare.Read時再在網絡連接建立,我可以重新獲取鎖,然後刪除實際文件之前進行妥善處理,直到該文件被關閉)會失敗。

左右。

我希望這不是太亂碼,對某些人很有用否則。與我的大部分編程問題一樣,這是一個比我預期的問題更簡單的例子,並且把我扔掉了它的蹤跡:)