无法通过 C# 控制台应用程序随机访问 xml 文件

本文关键字:随机 访问 xml 文件 应用程序 控制台 | 更新日期: 2023-09-27 18:31:48

我有一个C#控制台应用程序,它在运行时创建,解析和删除多个xml文件。该应用程序曾经在带有.Net 2.0的Windows 2003服务器中运行良好。最近,应用程序框架升级到>net 4.0,Windows Server OS升级到Windows 2008 64位。

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

Access to the path 'D:'Content'iSDC'GDCOasis'GATE_DATA'LOG'635125008068192773'635125008074911566'SOD'AllRespId.xml' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.Delete(String path) at ProcessGateFile.SOD.saveFile(String psFile, String psXMLString, Boolean 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");

我再说一遍,错误是随机发生的,即它在同一过程中有时有效,而在其他时间不工作。

知道可能导致这种情况的原因以及如何解决吗?

无法通过 C# 控制台应用程序随机访问 xml 文件

只是几个观察:

  1. 为什么要保存然后立即再次加载文件?事实上,为什么你甚至需要保存这个文件 - 你已经在 sbldDistinctResp 变量中拥有生成你需要使用的 XML 所需的所有信息(如代码开头的 saveFile 调用所证明的那样) - 你不能只是复制它,用与saveFile相同的 XML 包围它吗? 并与之合作?

  2. "它是随机发生的"是一个非常主观的观察:)。您应该对此进行分析(例如,在循环中运行 10,000 次)并记录错误模式。您可能会感到惊讶的是,乍一看看似随机的东西实际上在大量运行中显示出清晰的模式。这可以帮助您在问题与服务器上其他一些明显不相关的事件之间建立联系;或者它可能会确认它确实是随机的,因此不受您的控制。

  3. 如果您真的找不到问题并且您采用了防病毒等的想法,那么您可以将加载代码包装在 try/catch 中,并在收到错误时重试几次。这很笨拙,但它会起作用,假设您已经接受了最初的错误超出了您的控制范围。