C# 另一进程asp.net使用的文件
我已经在asp.NETMVC中开发了一个网站,可以从xml文件中读取一些数据。我的后端进程会定期更新此文件,该进程构建此xml文件,并最终通过ftp将其上载到我的Web主机 这一直运作良好,但在过去的一周左右,我遇到了一个问题。我得到asp.net异常“文件正被另一个进程使用”。我不知道这可能是什么,我觉得很奇怪。我已经有几个月没有修改代码了 下面是我用于序列化xml文件的典型方法:C# 另一进程asp.net使用的文件,c#,asp.net,file,file-upload,asynchronous,C#,Asp.net,File,File Upload,Asynchronous,我已经在asp.NETMVC中开发了一个网站,可以从xml文件中读取一些数据。我的后端进程会定期更新此文件,该进程构建此xml文件,并最终通过ftp将其上载到我的Web主机 这一直运作良好,但在过去的一周左右,我遇到了一个问题。我得到asp.net异常“文件正被另一个进程使用”。我不知道这可能是什么,我觉得很奇怪。我已经有几个月没有修改代码了 下面是我用于序列化xml文件的典型方法: public static IEnumerable<FStreamObject> GetSt
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);
}
}
公共静态IEnumerable GetStreams()
{
使用(FileStream fs=newfilestream(HttpRuntime.AppDomainAppPath+“/ff.xml”,FileMode.Open))
{
XmlReader ffXML=XmlReader.Create(fs);
XmlSerializer ser=新的XmlSerializer(typeof(FXmlModel));
var sList=(FXmlModel)序列反序列化(ffXML);
fs.Close();
返回sList.FSObjectList.OrderByDescending(x=>x.Cash);
}
}
我想另一个更新文件内容的过程仍然锁定了这个文件。因此,您可能需要修复该文件的代码,以确保在完成文件操作后释放对此文件的所有锁定/连接。问题可能是在调用fs.Close()之前引发了异常。
尝试使用Try-catch finally并将fs.Close()放在finally块中
还请记住Close()方法不会立即销毁对象,您也可以尝试使用Dispose()来确保从内存中清除引用
希望有帮助 您可以使用Process Explorer查找哪个进程将文件()+1用于Process Explorer。将来将为您节省大量时间。即使引发异常,使用block也应该关闭流,因此不需要fs.close()。@Giedrius您是对的。当线程被迫中止时,该规则有一个例外……但如果发生这种情况,我的代码也将无效;)这似乎不是问题所在。问题一定出在我的网络主机上。我可以关闭更新此文件的服务器,即使我手动更新该文件,我仍然有相同的问题。我的asp.net mvc代码中一定有一些设计错误。@JamesFord:因为您使用的是
using
块,所以我认为您没有在代码中执行文件锁定。如果使用块发生错误(调用Dispose释放内存),它会小心处理。所以这应该是另一个进程的问题。我已经尝试查找问题有一段时间了。看来你是对的。不知怎的,我的进程锁定了文件。看起来它正在进行一些改变。干杯