【问题标题】:How do I append only updated texts?如何仅附加更新的文本?
【发布时间】:2023-09-20 07:19:01
【问题描述】:

我有一个 Winform 控件来编写笔记,其内容会定期上传到服务器。 我需要创建一个本地文件作为备份来保存笔记的内容。 当我在便笺框中键入文本时,内容仍保留在便笺框中并保存到本地文本文件中。但是,当我在便笺框中输入更多文本时,以前的内容以及新内容都会附加到本地文件中。 如何确保仅将最近的内容附加到本地文件?如果我清除便笺框内容,则不会有任何内容登录到服务器。

 private void btnNote_Click(object sender, EventArgs e)
        {

            Note noteFrm = new Note();

            //set Note Text
            noteFrm.NoteText = _timeCard.NoteText;

            if (noteFrm.ShowDialog() == DialogResult.OK)
            {
                //Save notes locally as well
                string path = @"C:\QB Notes\";
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                string projname = this._timeCard.Project.ProjectName.TrimEnd()+".txt";
                string fileloc = path + projname;

                // FileStream fs = null;
                 if (!File.Exists(fileloc))
                 {      
                     using (TextWriter txt = new StreamWriter(fileloc))
                     {
                        // TextWriter txt = new StreamWriter(fileloc);
                         txt.Write(noteFrm.NoteText + Environment.NewLine);
                        txt.Close();
                     }
                 }
                 else if (File.Exists(fileloc))
                 {
                     using (var txt = new StreamWriter(fileloc, true))
                     {
                        txt.BaseStream.Seek(0, SeekOrigin.End);
                        txt.Write(noteFrm.NoteText + Environment.NewLine);                  
                         txt.Close();
                     }
                 }
                //noteFrm.NoteText="";
                //get Note Text
                _timeCard.NoteText = noteFrm.NoteText;
                Utils.LogManager.write("New Note Text: " + noteFrm.NoteText);
            }

        }

【问题讨论】:

  • 定义“最近的内容”。记住最后保存的字符的字符索引是否足够?如果您返回并编辑已保存的内容怎么办?只写整个文件而不是追加文件可以吗?
  • 保存时覆盖文件不是更容易吗?例如,如果他们回去修复错字怎么办?试图管理这一切将是一场噩梦。
  • 我想覆盖整个文件是可以的,但你能告诉我如何从特定索引读取和写入吗? @Wyck
  • @V_stack 您可以使用File.AppendAllText 将文本添加到文件末尾。但是你不能在不重写整个文件的情况下将文本添加到文件中间(你需要读取文件,插入文本,然后替换整个文件)
  • 覆盖整个内容的问题是,我正在处理的应用程序经常崩溃。当它崩溃时,注释框中的数据会丢失最后一个数据条目,如果只是再次向其中添加新数据而不先将本地文件中的内容复制到它,我会丢失该数据条目,因为它会替换整个文件.我不确定我是否解释得很好。 @Wyck

标签: c# winforms file streamwriter


【解决方案1】:

如果您希望文件始终与文本框中的内容匹配,那么我建议您将整个 if (!File.Exists(fileloc)) 块替换为以下内容:

File.WriteAllText(fileloc, noteFrm.NoteText + Environment.NewLine);

这将在需要时创建文件,打开文件,将所有内容替换为文本框中的内容,然后关闭文件。

【讨论】:

  • 这是答案的原因是:假设您将hi 放入文本框中并保存它。您的文件现在显示hi。然后你添加hello。文本框现在显示hi hello,因此当您将其附加到文件时,文件显示hi hi hello' because your adding it to the file. the method above will allow you to replace the text, and end up with hi hello`,而不是重复添加。
  • 覆盖整个内容的问题是,我正在处理的应用程序经常崩溃。当它崩溃时,注释框中的数据会丢失最后一个数据条目,如果只是再次向其中添加新数据而不先将本地文件中的内容复制到它,我会丢失该数据条目,因为它会替换整个文件.
  • 例如我输入“Hi”后跟“Hello”。现在我的本地文件既有“Hi”又有“Hello”,现在我的应用程序崩溃了。当我运行我的应用程序时,我的文本框现在只包含“嗨”。所以现在我需要复制具有“Hi”和“Hello”的本地文件的内容并将其粘贴回我的文本框中并继续写入。如果我不复制,继续写入,我会丢失“Hello”这个词,因为我的本地文件也会被覆盖
  • 您是否有理由不尝试找出应用程序崩溃的原因?
  • 我仍在尝试解决这部分问题,但在我找出导致问题的原因之前,我只是想维护一个本地副本。
最近更新 更多