2010-02-06 44 views
5

我有下面的代碼行:如何停止IIS 7鎖定.XSLT文件在C#

xslt.Load(XmlReader.Create(new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open))); 

xslt.Transform(mydoc.CreateReader(),null, sw); 

它工作正常,如果我停止該項目並再次啓動它,我得到以下錯誤:

[System.IO.IOException] = {「過程不能訪問該文件‘C:\網站\ TransList.xslt’。因爲它正被另一個進程」}

我然後有必須轉到命令行並執行IISRESET以獲取,我也可以重置應用程序池,這在當時是最簡單的,因爲這只是我的開發盒。

現在我有在一個try catch語句的電話,但我不能在處理程序訪問XSLT對象。

的XSLT對象似乎並不有密切的或處置方法。

垃圾收集器從來沒有在它得到了一槍,好像。

任何想法?

回答

9

您需要關閉您的FileStream和讀者,無論是明確使用.Close()或通過使用語句:

using (FileStream fs = new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open)) 
    { 
    xslt.Load(XmlReader.Create(fs)); 
    using (var reader = mydoc.CreateReader()) 
     { 
     xslt.Transform(reader, null, sw); 
     } 
    } 
+0

這也是一個更詳細的解決方案。已經有+6的評分,首先回答,給出這個答案。 – 2010-02-06 17:18:46

2

文件流實現IDisposable,並要求您調用的Dispose釋放外部資源以及隱式; y調用close()。您應該將您的Filestream實例化封裝在使用塊中,因爲它確保即使引發異常也會調用Dispose。要回答你的問題,因爲你沒有關閉文件流,你的進程,大概是w3wp.exe進程仍然有文件流的句柄,你可以釋放的唯一方法是重置iis或回收應用程序池。爲了將來的參考,只需將文件流包裝在使用塊中以確保安全。

4

無需顯式地創建一個FileStream和一個XmlReader,如果知道該文件的位置,那麼你可以簡單地傳遞給Load方法,使用this overload

XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load(@"C:\website\Translist.xslt"); 

如果你認爲你需要創建一個FileStream和一個XmlReader,然後我同意已經提出的建議,使用'using'語句來正確關閉和處理這些對象。

+0

謝謝,這是問題所在。我刪除了文件流,這就是我需要做的。奇蹟般有效。 – 2010-02-06 17:13:32