在循环语句中向文本文件添加新行

Add new line to a text file in loop statement

我创建了一个从文本框中获取用户名的循环。我想将名称放入文本文件并每次添加一个新行。它不工作。它再次覆盖了以前的名称。我知道如何向文本文件添加新行,但在循环语句中它不起作用。 这是我的代码:

for (int i = 0; i < txt_user.length ; i++ )
{
    File.WriteAllText(@"C:\mail\users.txt", txt_user[i].Text + Environment.NewLine);
}

这是在循环外编写新行的示例代码 - 它有效:

File.WriteAllText(@"C:\mail\users.txt", txt_user1.Text + Environment.NewLine + "abc");

你很接近:有 File.AppendAllText() or File.AppendText(). You could also collect all lines in memory first and use File.AppendAllLines()(如果你有足够的 RAM 来存储所有行)。

WriteAllText() 将写入新文件或覆盖现有文件。

这对于较小的文件来说效果很好,因为 OS 可能会应用一些缓存策略。但是,在循环中对非常大的文件执行此操作可能效率不高。那你应该看看FileStreams。

如果要添加到现有文件,请使用 File.AppendText。

如果实体太多,最好使用此代码

 using (StreamWriter sw = File.CreateText(@"C:\mail\users.txt")) 
        {
      for (int i = 0; i < txt_user.length ; i++ )
           {
            sw.WriteLine(txt_user[i].Text);   
           }
        }   

这将打开文件一次,并在枚举行时将行写入文本文件,然后关闭文件。它不会多次打开,也不会尝试在此过程中构建一个大字符串,这可能使其成为迄今为止给出的一堆答案中 I/O 和内存效率最高的。

File.WriteAllLines(@"C:\mail\users.txt",
  Enumerable
    .Range(0,txt_user.length)
    .Select(i=>txt_user[i].Text));

我推荐使用 StringBuilder:

var builder = new StringBuilder();
for (int i = 0; i < txt_user.length ; i++ )
    builder.AppendLine(txt_user[i].Text);
File.WriteAllText(@"C:\mail\users.txt", builder.ToString());

与其一直打开和关闭文件(因为这是 File.WriteAllText 在每次调用时所做的),不如使用字符串生成器准备文本并将其立即写入文件。由于文本来自文本框,因此我假设生成的字符串无论如何都不会很长。

var sb = new Stringbuilder();
for (int i = 0; i < txt_user.length; i++)
{
    sb.AppendLine(txt_user[i].Text);
}
File.WriteAllText(@"C:\mail\users.txt", sb.ToString());