如何替换/覆盖文本文件中的文本以更新信息?不附加文字

时间:2013-12-09 22:21:24

标签: c# winforms

这是现在的代码:

using (StreamWriter sw = File.CreateText(file))
                {
                    sw.WriteLine("Image Width: " + imageWidth.ToString());
                    sw.WriteLine("Image Height: " + imageHeight.ToString());
                    sw.WriteLine("Original Factor: " + originalFactor.ToString());
                    sw.WriteLine("Current Factor: " + currentFactor.ToString() + Environment.NewLine);
                    for (int i = 0; i < points.Count; i++)
                    {
                        sw.WriteLine("Coordinate " + i + ": " + points[i].ToString());
                    }
                }
            }
            using (StreamWriter sw = File.AppendText(file))
            {

            }

如果我将使用AppendText,它将添加新行。 我想要的是,如果我更改了imageWidth,例如originalFactor,那么它将在第一个位置写入的同一行中更新它的值。

如果点数列表例如有12个索引(点数),现在我添加了更多点数,列表现在有20个点,所以将点数附加到存在的点不要覆盖它们但添加新的点数。

我希望更改/更新它的所有前4行,并且只更改要追加的点列表。

在form1中,我有一个按钮点击事件,在新类中调用Save方法,我将值写入文本文件。

编辑**

对于点列表问题,我确实使用了AppendText:

using (StreamWriter sw = File.AppendText(file))
            {
                for (int i = 0; i < points.Count; i++)
                {
                    sw.WriteLine("Coordinate " + i + ": " + points[i].ToString());
                }
            }

但我想每次检查points.Count是否更新我的意思是当我点击按钮再次保存我不希望它每次附加相同的点列表只有当列表的计数更改更大然后是上一次。

我该怎么做?

1 个答案:

答案 0 :(得分:3)

最简单的方法可能是用新文件覆盖整个文件。

如果您肯定不需要这样做,那么您可以使用流的Position属性或Seek方法将新数据放入文件的同一部分,旧数据是。然后你还有另一个需要解决的问题,即如果新数据占用的字节数与旧数据不同,则必须将更改后的数据之后发生的所有字节移位。例如,假设您的原始文件是:

...
Current Factor: 9
Coordinate 1: (1, 1)
...

现在您要将其更改为:

...
Current Factor: 10
Coordinate 1: (1, 1)
...

如果单词“Coordinate”用于从文件中的第100个字节开始,则必须将其移动 - 以及其后的所有内容 - 从文件的第101或第102个字节开始(取决于在编写新的“当前因子”值之前,您正在使用的文本编码。另外请不要忘记,您必须移动出现在“坐标”一词之前的CRLF。

类似地,如果您将值从“10”更改为“9”,则必须在文件前面的一个或两个字节之后移动所有内容,并且还必须减少文件的长度一两个。

与其解决这些问题,我见过的大多数应用程序只是编写一个新文件,替换需要替换的行,然后删除旧文件并将新文件移动到原始文件名。