【问题标题】:Can't Access a xml file at random by C# console application无法通过 C# 控制台应用程序随机访问 xml 文件
【发布时间】:2013-09-18 07:42:57
【问题描述】:

我有一个 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");

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

知道是什么原因造成的以及如何解决吗?

【问题讨论】:

  • 您还没有在防病毒软件中添加一个更改,即在您创建文件后保持文件处于打开状态吗?
  • 你的“saveFile()”是什么样的?
  • 代码太多了。您能否将问题减少到足以引发异常的一两行?

标签: c# .net xml c#-4.0


【解决方案1】:

只是一些观察:

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

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

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

【讨论】:

  • @Bedabrata - 不确定你的评论是什么意思?
  • 抱歉,误按了 Enter。在下一个答案中发布了我的 cmets,因为它太大而无法发表评论:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2020-10-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多