2012-07-23 14 views
1

我在asp.net mvc中開發了一個網站,它從xml文件中讀取以顯示一些數據。這個文件由我的後端進程定期更新,這個進程構建了這個xml文件,最後通過ftp將它上傳到我的webhost。另一個進程使用的文件asp.net

這一直工作正常,但在上週左右,我已經陷入了一個問題。我得到了asp.net異常「正被另一個進程使用的文件」。我不知道這可能是什麼,我覺得很奇怪。我幾個月來甚至沒有在我的代碼中改變過任何東西。

下面你會發現,我用我的序列化XML文件的典型方法:

public static IEnumerable<FStreamObject> GetStreams() 
    { 

     using (FileStream fs = new FileStream(HttpRuntime.AppDomainAppPath+"/ff.xml", FileMode.Open)) 
     { 
      XmlReader ffXML = XmlReader.Create(fs); 

      XmlSerializer ser = new XmlSerializer(typeof(FXmlModel)); 

      var sList = (FXmlModel)ser.Deserialize(ffXML); 

      fs.Close(); 

      return sList.FSObjectList.OrderByDescending(x => x.Cash); 
     } 

    } 
+1

您可以使用Process Explorer http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx找到哪個進程使用您的文件(http://windowsxp.mvps.org/processlock.htm) – Giedrius 2012-07-23 12:36:33

+0

ProcessExplorer的+1。將來會爲你節省很多時間。 – 2012-07-23 12:39:00

回答

2

我猜測對方的過程,更新您的文件的內容仍然對這個文件的鎖。因此,您可能需要修復其中的代碼,以確保在完成文件操作後釋放對此文件的任何鎖定/連接。

+0

這似乎不是問題所在。問題必須在我的虛擬主機上。我可以關閉我的服務器來更新這個文件,而且我仍然有同樣的問題,即使我手動更新文件。它必須是我的asp.net mvc代碼中的一些設計錯誤。 – 2012-07-23 12:57:00

+2

@JamesFord:由於您使用'using'塊,因此我認爲您不會在您的代碼中執行文件鎖定。如果使用塊(調用Dispose來釋放內存),則使用塊會小心。所以它應該是另一個proc的問題。 – Shyju 2012-07-23 13:01:17

+0

我試圖找出問題一段時間了。看起來你是對的。不知何故,我的進程鎖定了文件。似乎現在正在進行一些更改。乾杯 – 2012-07-24 12:58:38

1

問題可能是在調用fs.Close()之前拋出異常。 嘗試使用try-catch-fianlly並將fs.Close()放在finally塊中。

還要記住Close()方法不會立即銷燬對象,還可以嘗試使用Dispose()以確保引用正在從內存中清除。

希望它有幫助!

+0

使用塊應該關閉流,即使拋出異常,所以fs.Close()是不需要的。 – Giedrius 2012-07-23 12:51:55

+0

@Giedrius你是對的。當線程被迫中止時,該規則有個例外......但是如果發生這種情況,我的代碼也將毫無用處;) – Demian 2012-07-23 13:08:26

相關問題