C# 如何向保存在C文本文件中的KeyValuePair追加新项#

C# 如何向保存在C文本文件中的KeyValuePair追加新项#,c#,C#,我正在生成图书序列号并保存到键值对 然后保存到文本文件,每个键都是唯一的 当我将其保存到文本文件时,会生成密钥,我可以检索密钥,并且它工作正常 当我生成第二个密钥并将其保存到文本文件时,它会覆盖文本文件并删除以前生成的密钥 生成密钥: private void GenerateButton1_Click(object sender, EventArgs e) { if (comboBox1.SelectedIndex == 0)

我正在生成图书序列号并保存到键值对 然后保存到文本文件,每个键都是唯一的

  • 当我将其保存到文本文件时,会生成密钥,我可以检索密钥,并且它工作正常

  • 当我生成第二个密钥并将其保存到文本文件时,它会覆盖文本文件并删除以前生成的密钥
  • 生成密钥:

    private void GenerateButton1_Click(object sender, EventArgs e)
            {
    
                if (comboBox1.SelectedIndex == 0)
                {
                    BookcomboBox2.Items.Clear();
    
                    from = int.Parse(FrmtextBox1.Text);
                    to = int.Parse(TotextBox2.Text);
    
                    result = to - from;
    
                    for (int i = 0; i <= result; i++)
                    {
                        string item = Convert.ToString(from + i); 
                        BookcomboBox2.Items.Add(item);
                        vals.Add(new KeyValuePair<int, string>(0, item)); // 
                    }
                    MessageBox.Show("Book No 1,  Generated Successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
    
                if (comboBox1.SelectedIndex == 1)
                {
                    BookcomboBox2.Items.Clear();
    
                    from = int.Parse(FrmtextBox1.Text);
                    to = int.Parse(TotextBox2.Text);
    
                    result = to - from;
    
                    for (int i = 0; i <= result; i++)
                    {
                        string item = Convert.ToString(from + i);
                        BookcomboBox2.Items.Add(item);
                        vals.Add(new KeyValuePair<int, string>(1, item)); // CatA has 0 key value
                    }
                    MessageBox.Show("Book No-2 Generated Successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
    
    当我添加新书,然后保存,而不是附加book-2时,它只会覆盖book-2文件,以前创建的book-1会被删除。

    p、 s:如果这个问题听起来很困惑,请提问

    已编辑

    patrick给出的解决方案有效,但在再次阅读时,它给了我以下错误:

    private void GenerateButton1_Click(object sender, EventArgs e)
            {
    
                if (comboBox1.SelectedIndex == 0)
                {
                    BookcomboBox2.Items.Clear();
    
                    from = int.Parse(FrmtextBox1.Text);
                    to = int.Parse(TotextBox2.Text);
    
                    result = to - from;
    
                    for (int i = 0; i <= result; i++)
                    {
                        string item = Convert.ToString(from + i); 
                        BookcomboBox2.Items.Add(item);
                        vals.Add(new KeyValuePair<int, string>(0, item)); // 
                    }
                    MessageBox.Show("Book No 1,  Generated Successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
    
                if (comboBox1.SelectedIndex == 1)
                {
                    BookcomboBox2.Items.Clear();
    
                    from = int.Parse(FrmtextBox1.Text);
                    to = int.Parse(TotextBox2.Text);
    
                    result = to - from;
    
                    for (int i = 0; i <= result; i++)
                    {
                        string item = Convert.ToString(from + i);
                        BookcomboBox2.Items.Add(item);
                        vals.Add(new KeyValuePair<int, string>(1, item)); // CatA has 0 key value
                    }
                    MessageBox.Show("Book No-2 Generated Successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
    

    当我查看文件时,我注意到:


    问题在于
    File.CreateText()
    将覆盖该文件(如果该文件已经存在)


    如果要附加到现有文件,可以使用
    new StreamWriter(path,append:true)
    代替问题是
    file.CreateText()
    将覆盖该文件(如果该文件已存在)


    如果要附加到现有文件,可以使用
    newstreamwriter(path,append:true)
    代替我找到了这个问题的正确解决方案

    仔细阅读本文:

    假设您必须向现有JSON文件添加用户,则 基本方法是:

    • 读取/解析JSON文件以获取内存中的数据结构

    • 修改数据结构以添加用户
    • 将数据结构解析/写入文件的新副本

    • 无法对JSON文件进行就地更新

    发件人:

    基本上,您将反序列化添加项的字典

    在生成之前,我已经在“Generate Button”的顶部添加了这段代码。我正在反序列化我的现有文件,并将其添加回我要添加新项的同一个字典“变量名应该完全相同!”

    if(File.Exists(“Books.txt”))
    {
    字符串jsonToRead=File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“Books.txt”);
    瓦尔斯=
    反序列化对象(jsonToRead);
    }
    

    通过这种方式,我从文本文件加载现有数据,并用新数据重新写入。就这样我找到了这个问题的正确答案

    仔细阅读本文:

    假设您必须向现有JSON文件添加用户,则 基本方法是:

    • 读取/解析JSON文件以获取内存中的数据结构

    • 修改数据结构以添加用户
    • 将数据结构解析/写入文件的新副本

    • 无法对JSON文件进行就地更新

    发件人:

    基本上,您将反序列化添加项的字典

    在生成之前,我已经在“Generate Button”的顶部添加了这段代码。我正在反序列化我的现有文件,并将其添加回我要添加新项的同一个字典“变量名应该完全相同!”

    if(File.Exists(“Books.txt”))
    {
    字符串jsonToRead=File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,“Books.txt”);
    瓦尔斯=
    反序列化对象(jsonToRead);
    }
    

    通过这种方式,我从文本文件加载现有数据,并用新数据重新写入。就这样

    这是您的全部代码吗?在
    字符串json=JsonConvert.SerializeObject(VAL)上设置断点第二次写作开始时,VAL的内容是什么?VAL包含第一本书。当添加第二本并重新写入VAL时,第一本被删除,第二本保留。这是您的全部代码吗?在
    string json=JsonConvert.SerializeObject(VAL)上设置断点第二次写作开始时,VAL的内容是什么?VAL包含第一本书。当第二本书被添加并重新写入VAL时,第1本书被删除,第二本书仍然保留。这是可行的,但当我再次阅读它时,它会给我带来错误,请检查我编辑过的问题。这个答案的问题是:它将键值对附加到数组的末尾,而不是放入引发错误的数组中,“读取JSON内容[]后遇到其他文本。当您想再次读取数据时,这将不起作用,因为它正在创建类似的内容。
    [{Array1}]”[“-->[Array2]
    这是可行的,但当我再次阅读时,它会给我错误,请检查我编辑的问题。这个答案的问题是:它将键值对附加到数组末尾,而不是放在引发错误的数组中,“阅读JSON内容后遇到的其他文本”[。当您想再次读取数据时,这将不起作用,因为它正在创建类似的内容。
    [{Array1}]“[”-->[Array2]
         if (File.Exists("Books.txt"))
                {
                    string jsonToRead = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Books.txt"));
                    vals =
                        JsonConvert.DeserializeObject<List<KeyValuePair<int, string>>>(jsonToRead);
                }