尽管append = false,但无法关闭文件,因此无法使用streamwriter覆盖文件

时间:2015-03-02 16:47:39

标签: c# file streamwriter overwrite

使用C#VS 2010,Windows窗体。 我的目标是只打开和关闭文件一次并多次“覆盖”它。我永远不想追加。打开和关闭文件一次的原因是我希望写操作最快。

我在streamwriter构造函数中传递append = false但它仍然附加而不是覆盖。

private void testSpeed()
{
StreamWriter sw1 = new StreamWriter(@"d:\logfolder\overwrite.txt", false);
            sw1.AutoFlush = true;
            for (int i = 0; i < 5000; i++)
            {               
                    sw1.Write(i);            
            }
            sw1.Close();
}

我的预期输出是文件应该只有4999 但我得到了这个 0123456789101112131415161718192021222324252627282930313233 ............... 一直到4999

此文件已存在 d:\ logfolder \ overwrite.txt

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:1)

append = false参数仅适用于流所执行的单个整体写入。每次调用stream.Write()都会将数据附加到流中已有的内容中。

在每次迭代期间,您需要Flush()Clear()流,但很可能无效。

要获得你想要的东西,你要么每次都要打开一个新的连接,要么等到最后一个要写的东西。

修改

只有sw1.autoflush = true意味着它会立即将Write()方法中的上下文写入文件,而不是等到连接关闭。

如果您只想编写集合中的最后一项,则可以执行以下操作:

for (int i = 0; i < 5000; i++)
{
    if (i == 4999)
    {
        sw1.Write(i);
    }
}

但是,如果您正在使用List或项目数组,那么您可以执行以下操作:

List<int> nums = new List<int>();

// Note that this requires the inclusion of the System.Linq namespace.
sw1.Write(nums.Last());

答案 1 :(得分:0)

您需要使用

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);