2017-02-20 10 views
0

Я пишу небольшой класс для управления конфигурацией XML для собственного приложения.Вторая итерация XDocument.Save() throwing «Доступ к пути запрещен»

Следующий код вызывается каждый раз, когда загружается новый список t, и пытается сериализовать данные для нового t или загрузить где t уже существует.

Мне не хватает чего-то фундаментального, но я не знаю, где.

Исключение брошено этим кодом

if (!File.Exists(Path.Combine(Environment.CurrentDirectory + "TaskData.xml"))) 
{ 
    XDocument doc = new XDocument(); 
    XElement rootElement = new XElement("ConfigData", 
           new XElement("Servers"), 
           new XElement("Paths")); 
    doc.Add(rootElement); 
    doc.Save("TaskData.xml"); 
} 

Специфическая линия "doc.Save ("TaskData.xml").

На первой итерации это отлично работает, и код создает файл шаблона.

На второй итерации, даже если файл xml находится в каталоге, File.Exists возвращает «false», а doc.Save выдает исключение разрешения.

Любая помощь очень ценится.

ответ

0

Я удивлен, что он работает над первой итерацией - потому что вы не проверяете полезный файл. Вместо вызова Path.Combine с несколькими аргументами вы объединяете TaskData.xml с текущим каталогом. Вы хотите:

if (!File.Exists(Path.Combine(Environment.CurrentDirectory, "TaskData.xml"))) 

Жаль, что ваш текущий код даже компилирует ... возможно Перегрузки для Path.Combine все должны иметь по крайней мере 2 требуется параметры не-парам-массив первых ...

+0

Wow , Я не могу поверить, что не понял этого ... Я считаю, что я копирую и вставляю из предыдущей версии, пытаясь облегчить проблему. Кроме того, перегрузка, которая вызывается, на самом деле является сигнатурой Path.Combine (String []), я удивлен, что компилятор принимает одну строку в качестве аргумента и будет неявно использовать ее. Я мог бы поклясться, что видел инстанты методов, которые принимают параметры массива, отказываются от этой ситуации. – SurelyTheresABetterWay

+0

@SurelyTheresABetterWay: Это 'params string []' - это нормально. Если бы он был просто 'string []', он бы не использовал его. –