我目前工作的一個文件處理服務,着眼於文件共享,在文件通過FTP上傳到。共享文件鎖
在可擴展性,我被要求作出這項服務能夠進行負載平衡,因此該服務有期待,在不同機器上的其他服務也可能試圖處理這些文件。
OK,所以我想我應該能夠處理文件之前得到我的過程中獨佔鎖,並跳過可能已經被其他進程鎖定任何文件實現這一目標。
這種方法的關鍵如下所示(我已經離開了錯誤處理的簡單):
using(FileStream fs = File.Open(myFile, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete))
{
//Do work
}
Q1:我的過程,現在對這個文件的鎖。我認爲這將意味着我可以訪問相同的文件(不使用流)並仍然具有正確的訪問權限,但基於測試,似乎我只具有通過流鎖定的好處。它是否正確?
(例如,之前我包括FileShare.Delete,File.Delete(MYFILE)失敗)
上面鎖最終使用的「寫入」權限,以確定哪些服務具有的文件,而是意在允許其他進程仍然讀取文件。這是因爲具有該鎖的進程嘗試驗證該文件是否是使用第三方庫(Xceed.Zip)的有效zip文件。但是,這沒有說明文件「正在被另一個進程使用」。使用反射我終於找到了問題的電話是:
stream = this.m_info.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
現在我本來期望這個工作,因爲它只是想要閱讀該文件,但它失敗。原因似乎在similar question中概述。但是,由於這是第三方API,我無法將其代碼更改爲使用ReadWrite。
Q2:有沒有一種方法可以正確鎖定文件,使其不會被其他服務佔用,但仍可以使用外部API將其驗證爲zip文件?
我覺得應該有一個'正確'的方法來做到這一點,但目前我能做到的最好的辦法是鎖定文件,將它從共享目錄移開,然後在新的位置。
接受爲替代解決方案是合理的。回答我自己的問題: 問題1:是的。鎖僅用於流,而不是流程 Q2:否。必須考慮替代方案。 – MattH 2010-04-23 10:39:46