如何从两个页面写入同一个xml文件



我有Single.csPeriodic.cs文件,它们有Button_Click事件,用户应该通过按下这些按钮将一些信息添加到同一文件中。Button_Click的实现几乎是一样的,这就是为什么我只展示其中一个。

using System.IO;
//.........
namespace ModernUIApp1.Pages
{
    public partial class Home : UserControl
    {

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // this is how i get required path
                var systemPath = System.Environment.GetFolderPath(
                                   Environment.SpecialFolder.CommonApplicationData);
                var _directoryName1 = Path.Combine(systemPath, "RadiolocationQ");
                string script = "script";               
                string path_scriprt1 = Path.Combine(_directoryName1, script+".xml");
                 cur_script.Add(new XElement("Single_Request" + Convert.ToString(num),
                                   new XElement("numRequest", TxtBlock_numRequest.Text),                        
                                                    ));
                cur_script.Save(path_scriprt1);
                num++;  // I use this to create unique name   
        }
        XElement cur_script = new XElement("Requestes");
        int num = 1;
    }
 }

最终,用户可以多次按下按钮,如果我不同时使用这些按钮,这个代码就会正常工作。因为否则它只会覆盖现有信息。所以问题是使这个XElement cur_script = new XElement("Requestes");全局化。或者你还有别的办法吗?

真正的问题是您需要避免这里的并发问题。如果你有两个人试图更新同一个文件,并且出现以下顺序:

  1. 用户1打开并加载文件
  2. 用户2打开并加载文件
  3. 用户1修改xml并保存
  4. 用户2修改xml并保存

在这种情况下,用户1所做的更改将丢失。

为了避免这个问题,你想保持文件打开,直到你保存它。例如:

using (FileStream stream = 
    File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
    ....load xml, modify it, and save it
}
public void WriteToDoc(XmlDocument doc, XElement element)
{
    // this method can reside somewhere outside.
    // some generic doc loader can load the doc   
    // add element to doc
}
public void OnButton1Click(object sender, RoutedEventArgs e)
{
    // do something with element
    WriteToDoc( mydoc, myNewElement)
}
public void OnButton2Click(object sender, RoutedEventArgs e)
{
    // do something else with element
    WriteToDoc( mydoc, myNewElement)
}

V2

public class ElementAdder
{
    public static void WriteToDoc(string path, XElement element)
    {
        // load doc based on path   
        // add element to doc
    }
}
public void OnButton1Click(object sender, RoutedEventArgs e)
{
    // do something with element
    string path = ConfigMan.GetDocPath();
    ElementAdder.WriteToDoc(path, myNewElement);
}
public void OnButton2Click(object sender, RoutedEventArgs e)
{
    // do something else with element
    string path = ConfigMan.GetDocPath();
    ElementAdder.WriteToDoc(path, myNewElement);
}

谢谢您的帮助,但我自己解决了这个问题。我只是用了一些技巧如何写入同一个xml文件,如下所示:

XDocument Requestes = XDocument.Load(path_scriprt1);
                    XElement newElement = new XElement("Single_Request" + Convert.ToString(num),
                                                        new XElement("numRequest", TxtBlock_numRequest.Text),
                                                        new XElement("IDWork", TxtBlock_IDWork.Text),
                                                        new XElement("NumObject", TxtBlock_NumObject.Text),
                                                        new XElement("lvlPriority", CmbBox_lvlPriority.Text),
                                                        new XElement("NumIn1Period", TxtBlock_NumIn1Period.Text)
                                                        );
                    Requestes.Descendants("Requestes").First().Add(newElement);
                    Requestes.Save(path_scriprt1);

最新更新