代码之家  ›  专栏  ›  技术社区  ›  James Campbell

如何在C中停止IIS 7锁定.XSLT文件#

  •  5
  • James Campbell  · 技术社区  · 16 年前

    我有以下几行代码:

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

    它工作正常,如果我停止项目并再次启动它,我会得到以下错误:

    [System.IO.IOException]={“该进程无法访问文件'C:\website\TransList.xslt',因为它正被另一个进程使用。”}

    然后我必须转到命令行并执行IISRESET来获取,我还可以重置应用程序池,这在此时是最简单的,因为这只是我的dev框。

    现在我在try-catch语句中有了调用,但我无法访问处理程序中的xslt对象。

    xslt对象似乎没有close或dispose方法。

    垃圾收集者,它似乎永远不会被击中。

    有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  9
  •   stuartd saeed    16 年前

    您需要显式使用.close()或通过using语句关闭FileStream和读取器:

    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);
            }
         }
    
        2
  •  4
  •   Martin Honnen    16 年前

    无需显式创建FileStream和XmlReader,如果您知道文件位置,则可以使用 this overload :

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

    如果您认为需要创建FileStream和XmlReader,那么我同意已经提出的建议,请使用“using”语句正确关闭和处理这些对象。

        3
  •  2
  •   Athens Holloway    16 年前

    Filestream实现IDisposable并要求您调用Dispose来释放外部资源和隐式资源;y调用close()。您应该将Filestream的实例化包装在using块中,因为即使引发异常,它也可以确保调用Dispose。不过,为了回答您的问题,由于您没有关闭文件流,您的进程(可能是w3wp.exe进程)仍然在文件流上有一个句柄,您可以释放该句柄的唯一方法是重置iis或回收应用程序池。为了便于将来参考,只需将文件流包装在using块中,以确保安全。