【问题标题】:The process cannot access the file because it is being used by another process. XML该进程无法访问该文件,因为它正被另一个进程使用。 XML
【发布时间】:2013-11-06 06:16:32
【问题描述】:

我在循环中使用相同的 xmlRequestPath 和 xmlResponsePath 文件调用以下方法。两次循环计数它在第三次迭代中执行良好我收到异常“该进程无法访问该文件,因为它正在被另一个进程使用。”。

    public static void UpdateBatchID(String xmlRequestPath, String xmlResponsePath)
    {
        String batchId = "";
        XDocument requestDoc = null;
        XDocument responseDoc = null;
        lock (locker)
        {
            using (var sr = new StreamReader(xmlRequestPath))
            {
                requestDoc = XDocument.Load(sr);
                var element = requestDoc.Root;
                batchId = element.Attribute("BatchID").Value;

                if (batchId.Length >= 16)
                {
                    batchId = batchId.Remove(0, 16).Insert(0, DateTime.Now.ToString("yyyyMMddHHmmssff"));
                }
                else if (batchId != "") { batchId = DateTime.Now.ToString("yyyyMMddHHmmssff"); }
                element.SetAttributeValue("BatchID", batchId);
            }

            using (var sw = new StreamWriter(xmlRequestPath))
            {
                requestDoc.Save(sw);
            }

            using (var sr = new StreamReader(xmlResponsePath))
            {
                responseDoc = XDocument.Load(sr);
                var elementResponse = responseDoc.Root;
                elementResponse.SetAttributeValue("BatchID", batchId);

            }

            using (var sw = new StreamWriter(xmlResponsePath))
            {                    
                responseDoc.Save(sw);                    
            }
        }
        Thread.Sleep(500);

        requestDoc = null;
        responseDoc = null;
    }

上述代码中的using (var sw = new StreamWriter(xmlResponsePath)) 发生异常。

例外:

The process cannot access the file 'D:\Projects\ESELServer20130902\trunk\Testing\ESL Server Testing\ESLServerTesting\ESLServerTesting\TestData\Assign\Expected Response\Assign5kMACResponse.xml' because it is being used by another process.

【问题讨论】:

  • 为什么你的 responseDoc.Save(sw);创建一个新的 sw 实例?它不应该在加载它并设置属性的同一 using 部分中吗?
  • 您好 Dijkgraaf,我正在创建 StreamReader 实例来读取 XML。完成设置属性后,我想将其保存在同一个 XML 文件中。所以我正在创建另一个 StreamWriter 实例以保存在我之前读过的同一个 XML 文件中。
  • 您的代码中是否有另一部分(在调用UpdateBatchID 方法之后)使用了 XML 文件?
  • 我认为您需要先关闭读取流,然后才能打开同一个文件进行写入。
  • 嗨 Andrei,是的,我正在从另一个线程将 xml 文件加载到一个对象中。但是文件访问是读取。这是造成问题的原因吗?序列化器 = 新 XmlSerializer(typeof(Response)); loadStream = new FileStream(inputFileName, FileMode.Open, FileAccess.Read);响应loadedResponseObject = (Response)serializer.Deserialize(loadStream);返回已加载的响应对象;

标签: c# xml


【解决方案1】:

也许在第三个循环中,流仍然处于关闭状态,所以它告诉你它是不可访问的。尝试在循环中再次调用之前稍等片刻,例如:

while (...)
{
    UpdateBatchID(xmlRequestPath, xmlResponsePath);
    System.Threading.Thread.Sleep(500);
}

或者,显式关闭流,而不是将工作留给垃圾收集器:

var sr = new StreamReader(xmlResponsePath);
responseDoc = XDocument.Load(sr);
     ....
sr.Close();

【讨论】:

    【解决方案2】:

    不要使用两个流,一个写入流和一个读取流,而是尝试只使用一个 FileStream,因为问题可能是在加载文件后流保持打开状态,直到垃圾收集器激活。

    using (FileSteam f = new FileStream(xmlResponsePath))
    {
         responseDoc = XDocument.Load(sr);
    
         var elementResponse = responseDoc.Root;
         elementResponse.SetAttributeValue("BatchID", batchId);
    
         responseDoc.Save(sw);                    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-10
      相关资源
      最近更新 更多