我想用更新後的版本替換IIS網站上的現有文件。說這些文件是大型的pdf文件,可以通過超鏈接訪問。該站點全天候運行,因此我擔心在某人正在嘗試讀取文件的同時正在更新文件時會鎖定問題。鎖定網站上的文件替換問題
使用服務器上運行的C#代碼更新文件。 我可以考慮打開文件進行寫入的兩個選項。
選項1)打開寫入文件,使用FileShare.Read:
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
雖然這個文件是開放的,用戶請求相同的文件通過超鏈接,文檔在網絡瀏覽器閱讀作爲一個空白頁面打開。
選項2)使用FileShare.None打開寫入文件:
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
雖然這個文件是開放的,用戶請求相同的文件通過超鏈接,瀏覽器顯示在Web瀏覽器閱讀一個錯誤。在IE 8中,您獲得了HTTP 500,「網站無法顯示頁面」,並且在Firefox 3.5中,您會得到:「該進程無法訪問該文件,因爲該文件正在被另一個進程使用。」
瀏覽器的行爲類型有道理,看起來合理。我猜想用戶嘗試在更新文件的同時嘗試讀取文件的可能性非常小。如果以某種方式,文件更新是原子的,就像使用包裹在事務中的SQL更新數據庫一樣。
我想知道你們是否擔心這類事情,並且更喜歡上述選項之一,或者甚至有其他更新文件的選項。
好吧,其實我結束了這是怎麼回事。雖然我看不到帶覆蓋參數的File.Move重載(我使用.net 2.0),但我必須首先明確調用File.Delete。最終用戶可以在瀏覽器中獲得「404文件未找到」錯誤的機會有一小段窗口,但這看起來不錯。 感謝所有人的回覆 - 他們可能會在未來需要時提供更強大的解決方案。 – 2009-12-02 02:44:14
哦,對。它是File.Copy中的覆蓋參數。對於那個很抱歉。 – Gonzalo 2009-12-02 02:53:18