我在IIS中托管了WCF服务,该服务使用以下代码生成xml文件:
XmlSerializer serializer = new XmlSerializer(typeof(Batch));
using (TextWriter textWriter = new StreamWriter(ConfigurationManager.AppSettings["SFTPDirectoryPath"] + "\\" + bundle.Name.Replace("dat", "xml")))
{
serializer.Serialize(textWriter, batch);
textWriter.Close();
}
在磁盘上写入XML文件之后,如果我尝试更改文件的内容,或者如果我尝试删除该文件,则会收到另一个进程正在使用该文件的错误消息,关闭所有程序使用该文件。我下载了一个名为“ofview”的应用程序,该应用程序显示哪个进程持有该文件的句柄并锁定它。它表明aspnet_wp持有XML文件的锁。 ofview允许我释放这个句柄,然后我可以更改文件或删除它。
我的问题是:一旦我在代码中写完文件,我怎样才能以编程方式释放句柄?我错过了什么吗?谢谢你的帮助。
答案 0 :(得分:0)
如果您只有您发布的代码,那么在您调用textWriter.Close()
后,文件句柄实际上会立即释放 - 尝试将相同的代码单独放在虚拟项目中并逐步执行。在调用textWriter.Close(
)之前尝试删除文件时应该收到错误,但应该能够在textWriter.Close()
之后立即删除该文件。
您的服务中是否还有其他I / O?
修改强>
不确定这是否会有所帮助,但您可以尝试在关闭呼叫之前刷新流:
serializer.Serialize(textWriter, batch);
textWriter.Flush();
textWriter.Close();