【问题标题】:IO exception (XML) - the process cannot access the file because it is used by another processIO 异常 (XML) - 进程无法访问该文件,因为它被另一个进程使用
【发布时间】:2018-10-21 09:39:11
【问题描述】:

我创建了一个名为 Shipment 的类,它具有以下静态方法:

public static void WriteShipment(Shipment s, string path)
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.IndentChars = "\t";
    XmlWriter w = XmlWriter.Create(path, settings);
    w.WriteStartDocument();
    w.WriteStartElement("Shipment");
    w.WriteStartElement("id");
    w.WriteString(s.id);
    w.WriteEndElement();
    Address.WriteAddress(s.from, path);
    Address.WriteAddress(s.to, path);
    Date.WriteDate(s.receiveDate, path);
    Date.WriteDate(s.deliverDate, path);
    w.WriteStartElement("sum");
    w.WriteValue(s.sum);
    w.WriteEndElement();
    w.WriteStartElement("currency");
    w.WriteString(s.currency);
    w.WriteEndElement();
    w.WriteStartElement("paid");
    w.WriteValue(s.paid);
    w.WriteEndElement();
    w.WriteEndElement();
    w.WriteEndDocument();
    w.Close();
}

我正在尝试编写一个方法来接收Shipment 类的实例并创建一个包含其详细信息的 XML 文件。

Shipment 的一些字段类型为AddressDate,它们是我创建的其他类。它们还具有静态方法,可将作为参数接收的实例的详细信息写入 XML 文件。

WriteAddressWriteDate 方法运行良好,但是当我尝试在 WriteShipment 方法中调用它们时,在运行时出现以下异常 -

“该进程无法访问文件,因为它被另一个进程使用”

我发现这是因为WriteAddressWriteDate 试图写入WriteShipment 已经写入的同一个文件(因为它们都共享相同的路径)。

有没有办法克服这个问题?我尝试过的任何其他解决方案都被证明是徒劳的或导致其他问题。

【问题讨论】:

标签: c# xml exception io ioexception


【解决方案1】:

您看到的问题可能是因为WriteAddressWriteDate 方法试图打开已经打开的文件。

当您调用XmlWriter.Create 时,该文件被“锁定”,因此只能使用w 变量对其进行写入,并且在您调用w.Close() 之前它一直保持锁定状态。

您最好的选择是将w 变量作为参数传递给WriteAddressWriteDate 方法并将其写入文件。

另外,作为建议,请考虑将您的代码放入using block。这样,如果任何方法抛出异常,您将不会被锁定文件。

【讨论】:

  • 谢谢!我之前曾尝试将我的 XmlWriter 作为参数传递,但后来我无法缩进它,并且创建的文件中的所有 XML 代码都写在一行中。你知道我怎样才能将我的 XmlWriter 作为参数传递并使其缩进(代码开头的设置变量当前所做的)?
  • 我支持 Ryan S。使用 try catch 和 using 块。此外,如果您现在遇到格式问题,如果您的运行时异常不再是问题,您可能需要更新您的问题或开始一个新问题。确保并标记解决您的问题的答案;)
  • 缩进应该自动工作。 XmlWriter 包含您在创建 XmlWriter 对象时提供的缩进设置。再试一次,如果还是不行,请贴出你的 WriteAddress 方法的代码。
【解决方案2】:

有很多方法可以解决这个问题。这里有一些建议。

  1. 在执行WriteDateWriteAddress 方法之前关闭WriteShipment 中的XmlWriter。完成后重新打开它
  2. 无需打开并写入WriteData/Address 中的文件,只需返回一个字符串,然后将其写入WriteShipment 中的文件。是否有任何情况需要直接使用WriteData/Address 编写,而不是通过WriteShipment 方法的一部分?

【讨论】:

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