【问题标题】:C# - StreamWriter appending to file when append is set to false [duplicate]C# - 当追加设置为 false 时,StreamWriter 追加到文件 [重复]
【发布时间】:2018-04-17 18:19:28
【问题描述】:

我正在开发一个写入 .txt 文件的简单控制台应用程序。我几乎没有将附加设置为 false 的 Streamwriter:

StreamWriter j1 = new StreamWriter(@"jmeno1.txt", false);
StreamWriter j2 = new StreamWriter(@"jmeno2.txt", false);
StreamWriter s1 = new StreamWriter(@"skore1.txt", false);
StreamWriter s2 = new StreamWriter(@"skore2.txt", false);
StreamWriter l1 = new StreamWriter(@"legy1.txt", false);
StreamWriter l2 = new StreamWriter(@"legy2.txt", false);

首先我写下默认值:

string jmeno1;
string jmeno2;
int legy1 = 0;
int legy2 = 0;
int skore1 = 501;
int skore2 = 501;
Console.WriteLine("První jméno?");
jmeno1 = Console.ReadLine();
Console.WriteLine("Druhé jméno?");
jmeno2 = Console.ReadLine();

j1.WriteLine(jmeno1);
j2.WriteLine(jmeno2);
s1.WriteLine(skore1.ToString());
s2.WriteLine(skore2.ToString());
l1.WriteLine(legy1.ToString());
l2.WriteLine(legy2.ToString());
j1.Flush();
j2.Flush();
s1.Flush();
s2.Flush();
l1.Flush();
l2.Flush();

然后在一些用户输入后,我想用新字符串覆盖这些文件(使用与默认字符串相同的方式)。但是文件没有被覆盖,文本只是被附加。我觉得这很奇怪,因为附加设置为假。我以前从未经历过。

这是写入文件发生的代码部分(对不起外语):

Console.WriteLine("\n" + jmeno1 + " hodil/a?");
skore1 = skore1 - int.Parse(Console.ReadLine());

if (skore1 == 0)
{
    legy1++;

    // writing to file
    l1.WriteLine(legy1.ToString());
    l1.Flush();

    Console.WriteLine("\n" + jmeno1 + " zavřel/a!");
    skore1 = 501;                                       
    skore2 = 501;

    // writing to file
    s1.WriteLine(skore1.ToString());
    s2.WriteLine(skore2.ToString());

    s1.Flush();
    s2.Flush();
    zacina = 2;
}

else
{
    // writing to file
    s1.WriteLine(skore1.ToString());
    s1.Flush();

    Console.WriteLine("\n" + jmeno2 + " hodil/a?");
    skore2 = skore2 - int.Parse(Console.ReadLine());

    if (skore2 == 0)
    {
        legy2++;

        // writing to file
        l2.WriteLine(legy2.ToString());
        l2.Flush();

        Console.WriteLine("\n" + jmeno2 + " zavřel/a!");
        skore1 = 501;
        skore2 = 501;

        // writing to file
        s1.WriteLine(skore1.ToString());
        s2.WriteLine(skore2.ToString());
        s1.Flush();
        s2.Flush();

        zacina = 2;
    }

    else
    {
        // writing to file
        s2.WriteLine(skore2.ToString());
        s2.Flush();
    }
}

带有分数的文件看起来像this

感谢您的帮助。

【问题讨论】:

  • 请提供minimal reproducible example - 最好只提供一个文件。我强烈怀疑你是误诊或误解;它真的不会附加该代码。
  • 您的意思是在关闭 StreamWriters 之前您看到它们附加?我很高兴他们这样做,因为否则不可能在一个文件中写入多行。您是否尝试过在写入默认值后关闭它们并在您想要覆盖它们时重新打开它们?
  • 是的,就是这样!我忘了关闭它们。非常感谢!

标签: c# append streamwriter


【解决方案1】:

您的代码(在撰写本文时不完整)对StreamWriterappending 模式(我们称之为SR)的含义有一个错误的假设。一旦打开文件并且 SR 写入第一行,然后是 SR.Flush,您只需将文本写入文件,将 FileStream 位置提前到写入文本的字节长度,并将包含文本的缓冲区刷新到磁盘。下一次调用SR.WriteLine 将在最后一个FileStrea.Position 开始的同一文件中写入下一行,而不会覆盖任何内容。

StreamWriter 的附加到文件选项仅意味着当您下次使用StreamWriter 打开同一个文件时,它会将文本附加到现有内容。相反,使用选项 not append 创建新的空文件,该文件将覆盖该文件中先前存在的任何现有内容。 bool append 构造函数参数的 MSDN 文档说明如下:

附加 Type: System.Boolean true 将数据附加到文件中; false 覆盖文件。如果指定的文件不存在,则该参数无效,构造函数创建一个新文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2013-10-26
    • 2015-11-22
    • 1970-01-01
    • 2021-12-13
    • 2021-02-23
    相关资源
    最近更新 更多