Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 另一进程asp.net使用的文件_C#_Asp.net_File_File Upload_Asynchronous - Fatal编程技术网

C# 另一进程asp.net使用的文件

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

我已经在asp.NETMVC中开发了一个网站,可以从xml文件中读取一些数据。我的后端进程会定期更新此文件,该进程构建此xml文件,并最终通过ftp将其上载到我的Web主机

这一直运作良好,但在过去的一周左右,我遇到了一个问题。我得到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);
        }

    }
公共静态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释放内存),它会小心处理。所以这应该是另一个进程的问题。我已经尝试查找问题有一段时间了。看来你是对的。不知怎的,我的进程锁定了文件。看起来它正在进行一些改变。干杯