IO 异常 (XML) - 进程无法访问该文件,因为它已被另一个进程使用
IO exception (XML) - the process cannot access the file because it is used by another process
我创建了一个名为 Shipment 的 class,它具有以下静态方法:
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
class 的实例并创建一个包含其详细信息的 XML 文件。
Shipment 的某些字段属于 Address
和 Date
类型,它们是我创建的其他 classes。它们还有静态方法,可以将实例的详细信息作为参数接收到 XML 文件中。
WriteAddress
和 WriteDate
方法工作得很好,但是当我尝试在 WriteShipment
方法中调用它们时,我在 运行-时间 -
"the process cannot access file because it is used by another process"
我发现这是因为 WriteAddress
和 WriteDate
正在尝试写入同一个文件 WriteShipment
已经写入(因为它们共享相同的路径)。
有办法克服这个问题吗?我尝试过的任何其他解决方案都被证明是徒劳的或导致了其他问题。
有很多方法可以解决这个问题。这里有一些建议。
- 在执行
WriteDate
和WriteAddress
方法之前关闭WriteShipment
中的XmlWriter
。完成后重新打开它
- 不是打开并写入
WriteData/Address
中的文件,而是 return 一个字符串,然后将其写入 WriteShipment
中的文件。是否有任何情况需要直接使用 WriteData/Address
编写,而不是通过 WriteShipment
方法编写?
您看到的问题可能是因为 WriteAddress
和 WriteDate
方法试图打开已经打开的文件。
当您调用 XmlWriter.Create
时,文件 'locked' 只能使用 w
变量写入,并且在您调用w.Close()
.
您最好的选择是将 w
变量作为参数传递给 WriteAddress
和 WriteDate
方法,然后写入文件。
此外,作为建议,考虑将您的代码放入 using block。这样,如果任何方法抛出异常,您将不会看到文件仍然处于锁定状态。
我创建了一个名为 Shipment 的 class,它具有以下静态方法:
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
class 的实例并创建一个包含其详细信息的 XML 文件。
Shipment 的某些字段属于 Address
和 Date
类型,它们是我创建的其他 classes。它们还有静态方法,可以将实例的详细信息作为参数接收到 XML 文件中。
WriteAddress
和 WriteDate
方法工作得很好,但是当我尝试在 WriteShipment
方法中调用它们时,我在 运行-时间 -
"the process cannot access file because it is used by another process"
我发现这是因为 WriteAddress
和 WriteDate
正在尝试写入同一个文件 WriteShipment
已经写入(因为它们共享相同的路径)。
有办法克服这个问题吗?我尝试过的任何其他解决方案都被证明是徒劳的或导致了其他问题。
有很多方法可以解决这个问题。这里有一些建议。
- 在执行
WriteDate
和WriteAddress
方法之前关闭WriteShipment
中的XmlWriter
。完成后重新打开它 - 不是打开并写入
WriteData/Address
中的文件,而是 return 一个字符串,然后将其写入WriteShipment
中的文件。是否有任何情况需要直接使用WriteData/Address
编写,而不是通过WriteShipment
方法编写?
您看到的问题可能是因为 WriteAddress
和 WriteDate
方法试图打开已经打开的文件。
当您调用 XmlWriter.Create
时,文件 'locked' 只能使用 w
变量写入,并且在您调用w.Close()
.
您最好的选择是将 w
变量作为参数传递给 WriteAddress
和 WriteDate
方法,然后写入文件。
此外,作为建议,考虑将您的代码放入 using block。这样,如果任何方法抛出异常,您将不会看到文件仍然处于锁定状态。