2017-04-11 22 views
1

XMLファイルに設定をロードして書き込むアプリケーションで作業していました。私はこのことについていくつかの意見があることを知っていますが、私はこのコードに問題があります。XMLファイルを保存すると1つのエントリしか保存されていないようです

 private static void AddToXmlTemplate(Template tmp, string _config) 
    { 
     string configFile = _config + "configuredTemplate.xml"; 
     FileStream fs = new FileStream(configFile, FileMode.OpenOrCreate); 
     if (File.Exists(configFile)) { 
      XDocument xD = new XDocument(); 
      xD.Add(new XElement("Store", 
       new XElement("template", 
       new XElement("filePath", tmp.TempPath), 
       new XElement("Name", tmp.TempName), 
       new XElement("description", tmp.TempDesc)))); 
      xD.Save(fs); 
      fs.Flush(); 
      fs.Dispose(); 
      //commenting for change to allow sync. 
     } 
     else 
     { 
      /********------ appends the template to the config file.------*************/ 
      XDocument xD = XDocument.Load(fs); 
      XElement root = xD.Element("Store"); 
      IEnumerable<XElement> rows = root.Descendants("template"); 
      XElement last = rows.Last(); 
      last.AddAfterSelf(
       new XElement("template"), 
       new XElement("filePath", tmp.TempPath), 
       new XElement("Name", tmp.TempName), 
       new XElement("description", tmp.TempDesc)); 
      xD.Save(fs); 
      fs.Flush(); 
      fs.Dispose(); 

     } 
    } 

この関数全体が別の関数内のforeachループ内で呼び出され、すべての機能は、フォルダ内の設定ファイルがあるかどうかを確認htmlファイルをチェックし、情報をユーザーに尋ねるであるためにすべきですファイルについての情報を入力し、XMLファイルに保存します。

私は、Filestreamの操作、おそらくはXDocumentを呼び出し関数に移し、それをこの関数に渡す必要があると考えています。

大きな問題は、ノードの最後のセットだけを保存することです。

答えて

0

問題はif (!File.Exists(configFile))と思います。あなたはこれを試すことができます:

private static void AddToXmlTemplate(Template tmp, string _config) 
    { 
     string configFile = Path.Combine(_config, "configuredTemplate.xml"); 
     using (FileStream fs = new FileStream(configFile, FileMode.OpenOrCreate)) 
     { 
      if (!File.Exists(configFile)) 
      { 
       XElement xD = new XElement("Store", 
        new XElement("template"), 
        new XElement("filePath", tmp.TempPath), 
        new XElement("Name", tmp.TempName), 
        new XElement("description", tmp.TempDesc)); 
       xD.Save(fs); 
       fs.Flush(); 
      } 
      else 
      { 
       XDocument xD = XDocument.Load(fs); 
       XElement root = xD.Element("Store"); 
       IEnumerable<XElement> rows = root.Descendants("template"); 
       XElement last = rows.Last(); 
       last.AddAfterSelf(
        new XElement("template"), 
        new XElement("filePath", tmp.TempPath), 
        new XElement("Name", tmp.TempName), 
        new XElement("description", tmp.TempDesc)); 
       xD.Save(fs); 
       fs.Flush(); 
      } 
     } 
    } 
+0

これがどのように動作するかはわかりますが、変更を加えるとelseブロックのみが実行されます。 –

+0

@ChrisRutherfordおそらく、problesがファイルパスを持っています。文字列configFile = Path.Combine(_config、 "configuredTemplate.xml") – daniell89

0

確かにifステートメントのロジックが間違った方法ですか?

現在、ファイルが存在する場合は新しいxmlファイルを作成していない場合は追加しますが、それ以外の方法で行う必要があります。

あなたはこのように変更した場合、それは

if (!File.Exists(configFile)) { 
+0

を使用してみてください。他の奇妙なロジックの問題がありました。私はもともとそのようにしていましたが、2番目のブロックしか実行しませんでした。 –

+0

ああ、あなたがファイルストリームを作成していて、それが存在するかどうかをチェックしているからです。私の他の答えを見てください。 – toby

0

ああを動作するはずです、私はそのあなたが最初のファイルストリームを作成し、それが存在するかどうかをチェックするので、それは常に存在しますしているためだと思います。

private static void AddToXmlTemplate(Template tmp, string _config) 
{ 
    string configFile = _config + "configuredTemplate.xml"; 

    if (!File.Exists(configFile)) { 
     FileStream fs = new FileStream(configFile, FileMode.OpenOrCreate) 
     XDocument xD = new XDocument(); 
     xD.Add(new XElement("Store", 
      new XElement("template", 
      new XElement("filePath", tmp.TempPath), 
      new XElement("Name", tmp.TempName), 
      new XElement("description", tmp.TempDesc)))); 
     xD.Save(fs); 
     fs.Flush(); 
     fs.Dispose(); 
     //commenting for change to allow sync. 
    } 
    else 
    { 
     FileStream fs = new FileStream(configFile, FileMode.Open);    
/********------ appends the template to the config file.------*************/ 
     XDocument xD = XDocument.Load(fs); 
     XElement root = xD.Element("Store"); 
     IEnumerable<XElement> rows = root.Descendants("template"); 
     XElement last = rows.Last(); 
     last.AddAfterSelf(
      new XElement("template"), 
      new XElement("filePath", tmp.TempPath), 
      new XElement("Name", tmp.TempName), 
      new XElement("description", tmp.TempDesc)); 
     xD.Save(fs); 
     fs.Flush(); 
     fs.Dispose(); 

    } 
} 
+0

これは理にかなっていますが、fsとxD変数が次回の実行に適切に保存/廃棄されているかどうかを知ることができますか? –

+0

正しいFileStreamを破棄しています。それを行うもう1つの方法は、 "using"を使うことです(http://stackoverflow.com/questions/212198/what-is-the-c-sharp-using-block-and-why-should-i-use-it) – toby

+0

ありがとう!今は、更新ブロックが新しいXML宣言項目を追加するところで問題を修正するだけです。 –

関連する問題