Исключение ввода-вывода (XML) - процесс не может получить доступ к файлу, поскольку он используется другим процессом - PullRequest
0 голосов
/ 11 мая 2018

Я создал класс с именем 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 с егодетали.

Некоторые поля отгрузки имеют тип Address и Date, которые являются другими классами, которые я создал.У них также есть статические методы, которые записывают подробности экземпляра, полученные в качестве параметра, в файл XML.

Методы WriteAddress и WriteDate работают превосходно, но когда я пытаюсь вызвать их внутри метода WriteShipment, я получаю следующее исключение во время выполнения -

"процесс не может получить доступ к файлу, потому что он используется другим процессом"

Я понял, что это происходит, потому что WriteAddress и WriteDate пытаются записать в тот же файл WriteShipment ужепишет (так как все они используют один и тот же путь).

Есть ли способ преодолеть это?Любое другое решение, которое я пробовал, оказалось бесполезным или вызвало другие проблемы.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вероятно, возникшая проблема связана с тем, что методы WriteAddress и WriteDate пытаются открыть уже открытый файл.

Когда вы вызываете XmlWriter.Create, файл «блокируется», так что его можно записать только в переменную w, и он остается заблокированным до тех пор, пока вы не вызовете w.Close().

Лучшим вариантом будет передать переменную w в качестве аргумента для методов WriteAddress и WriteDate и записать ее в файл.

Также, в качестве предложения, рассмотрите возможность помещения вашего кода в , используя блок . Таким образом, если какой-либо из методов выдаст исключение, файл не останется заблокированным.

0 голосов
/ 11 мая 2018

Есть много способов исправить это. Вот несколько предложений.

  1. Закройте XmlWriter в WriteShipment перед выполнением методов WriteDate и WriteAddress. Откройте его после того, как вы закончите
  2. Вместо открытия и записи в файл в WriteData/Address просто верните строку и затем запишите ее в файл в WriteShipment. В каком случае вам нужно писать напрямую, используя WriteData/Address, а не как часть метода WriteShipment?
...