Can';t通过C#控制台应用程序随机访问xml文件

Can';t通过C#控制台应用程序随机访问xml文件,c#,.net,xml,c#-4.0,C#,.net,Xml,C# 4.0,我有一个C#控制台应用程序,它可以在运行时创建、解析和删除多个xml文件。该应用程序在Windows 2003 server和.Net 2.0中正常运行。 最近,应用程序框架升级到>net 4.0,Windows Server操作系统升级到Windows 2008 64位 此后,应用程序随机遇到以下异常: 对路径“D:\Content\iSDC\GDCOasis\GATE\u DATA\LOG\635125008068192773\635125008074911566\SOD\AllRespId

我有一个C#控制台应用程序,它可以在运行时创建、解析和删除多个xml文件。该应用程序在Windows 2003 server和.Net 2.0中正常运行。 最近,应用程序框架升级到>net 4.0,Windows Server操作系统升级到Windows 2008 64位

此后,应用程序随机遇到以下异常:

对路径“D:\Content\iSDC\GDCOasis\GATE\u DATA\LOG\635125008068192773\635125008074911566\SOD\AllRespId.xml”的访问被拒绝。
在System.IO.\uuu Error.WinIOError(Int32 errorCode,字符串maybeFullPath)
在System.IO.File.Delete处(字符串路径)
在ProcessGateFile.SOD.saveFile(字符串psFile、字符串psXMLString、布尔值isNonAscii)

创建、解析和删除的代码如下:

saveFile(tmpPath + "\\SOD\\AllRespId.xml", "<?xml version= \"1.0\" ?><XML>" + sbldDistinctResp.ToString() + "</XML>", isChinese);

//Save list of Distinct responsibilities for User
sbldDistinctResp.Remove(0, sbldDistinctResp.Length);
xmlCase.Load(tmpPath + "\\SOD\\AllRespId.xml");
arrResps.Clear();

//Start preparing Responsibility selection criteria
RespNodes = xmlCase.SelectNodes("//row");
sRespCriteria = "";

if (RespNodes.Count > 0)
{
    foreach (XmlNode RespNode in RespNodes)
    {
        string RespName = RespNode.Attributes.GetNamedItem("RespId").Value.ToString();
        if (!arrResps.Contains(RespName))
        {
             arrResps.Add(RespName);
        }
    }
    for (int i = 0; i < arrResps.Count; i++)
    {
         sbldDistinctResp.Append("(@RespId = '" + arrResps[i].ToString() + "') or ");
    }
    sbldDistinctResp.Remove(sbldDistinctResp.Length - 4, 4);
    sRespCriteria = sbldDistinctResp.ToString();

    if (!sRespCriteria.Equals(""))
    {
         sRespCriteria = "(" + sRespCriteria + ")";
    }
 }
 File.Delete(tmpPath + "\\SOD\\AllRespId.xml");
saveFile(tmpPath+“\\SOD\\AllRespId.xml”,“+sbldDistinctResp.ToString()+”,iChinese);
//为用户保存不同职责的列表
sbldDistinctResp.Remove(0,sbldDistinctResp.Length);
Load(tmpPath+“\\SOD\\AllRespId.xml”);
arresps.Clear();
//开始准备责任选择标准
RespNodes=xmlCase.SelectNodes(//行);
sRespCriteria=“”;
如果(RespNodes.Count>0)
{
foreach(RespNodes中的XmlNode RespNode)
{
字符串RespName=RespNode.Attributes.GetNamedItem(“RespId”).Value.ToString();
如果(!arresps.Contains(RespName))
{
arresps.Add(RespName);
}
}
对于(int i=0;i
我重复一遍,错误是随机发生的,也就是说,在同一过程中,它有时起作用,而在其他时间不起作用


你知道是什么原因导致了这一现象,以及如何解决吗?

只是一些观察结果:

  • 为什么要保存文件,然后立即重新加载?事实上,为什么您甚至需要保存此文件?您已经在
    sbldDistinctResp
    变量中获得了生成需要使用的XML所需的所有信息(代码开头的
    saveFile
    调用证明了这一点)-难道您不能复制它吗,使用与您在
    saveFile
    过程中使用的相同的XML围绕它,然后使用它

  • “随机发生”是一个非常主观的观察:)。您应该对此进行分析(例如,在循环中运行10000次),并记录错误模式。你可能会很惊讶,一开始看似随机的东西实际上在大量运行中显示了一个清晰的模式。这可能有助于您将问题与服务器上其他一些显然无关的事件联系起来;或者它可以确认它确实是随机的,因此超出了你的控制范围

  • 如果你真的找不到问题,并且你有反病毒的想法,等等,那么你可以用try/catch来包装加载代码,如果你遇到错误,可以再试几次。这是一个骇客程序,但如果您已经接受初始错误超出您的控制范围,那么它将起作用


  • 您还没有在防病毒软件中添加一个更改,该更改会在创建文件后保持文件打开,对吗?这可能会解决问题:您的“saveFile()”看起来像什么?代码太多了。你能不能把问题简化为一行或两行就足以抛出异常?@Bedabrata-不确定你的评论是什么意思?对不起,错误地按了回车键。在下一个答案中发表了我的评论,因为它太大,无法发表评论:)