2017-02-20 3 views
0

Ich schreibe eine kleine Klasse, um Konfiguration XML für eine In-House-Anwendung zu verwalten.Zweite Iteration von XDocument.Save() wirft "Zugriff auf Pfad verweigert"

Der folgende Code wird jedes Mal aufgerufen, wenn eine neue Liste von t geladen wird, und versucht, Daten für neues t zu serialisieren, oder, wo t bereits vorhanden ist.

Ich vermisse etwas Grundlegendes, aber ich bin mir nicht sicher, wo.

Die Ausnahme wird durch diesen Code geworfen

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"); 
} 

Die spezifische Linie ist 'doc.Save ("TaskData.xml")'.

In der ersten Iteration funktioniert das einwandfrei, und der Code erstellt die Vorlagendatei.

In der zweiten Iteration, auch wenn die XML-Datei im Verzeichnis ist, gibt File.Exists 'false' zurück, und doc.Save löst die Berechtigungsausnahme aus.

Jede Hilfe wird sehr geschätzt.

Antwort

0

Ich bin überrascht, dass es an der ersten Iteration arbeitet - weil Sie nicht eine nützliche Datei überprüfen. Anstatt Path.Combine mit mehreren Argumenten aufzurufen, verketten Sie TaskData.xml mit dem aktuellen Verzeichnis. Sie wollen:

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

Es ist schade, dass Ihr aktueller Code kompiliert sogar ... wohl die Überlastungen für Path.Combine zunächst mindestens 2 erforderlich nicht-param-Array-Parameter haben sollten ...

+0

Wow Ich kann nicht glauben, dass ich das nicht verstanden habe ... Ich glaube, ich kopiere und klebte von einer früheren Version, um das Problem zu lindern. Auch die Überladung, die aufgerufen wird, ist tatsächlich die Path.Combine (String []) -Signatur, ich bin überrascht, dass der Compiler eine einzelne Zeichenfolge als Argument verwendet, und implizit wird das umgewandelt. Ich hätte schwören können, dass ich instanzierte Methoden gesehen habe, die Array-Parameter ablehnen, genau diese Situation. – SurelyTheresABetterWay

+0

@SurelyTheresABetterWay: Es ist eine 'params string []' - was in Ordnung ist. Wenn es nur 'string []' gewesen wäre, hätte es es nicht benutzt. –

Verwandte Themen