Maayan Cahani
Maayan Cahani

Reputation: 121

Add new line to a text file in loop statement

I created a loop that takes user names from a text boxes. I would like to put the names into a text file and add a new line each time. It's not working. It's once again overrides the previous name. I know how to add new line to a text file, but in the loop statement it dose not work. Here's my code:

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

Here is a sample code out of the loop as writing a new line - and it works:

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

Upvotes: 1

Views: 8185

Answers (6)

Robert McKee
Robert McKee

Reputation: 21477

This will open the file once, and write lines to the text file as it enumerates them, and then close the file. It doesn't do multiple opens, nor does it try and build up a large string in the process, which likely makes it the most I/O and memory efficient of the bunch of answers given so far.

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

Upvotes: 2

Arash
Arash

Reputation: 885

If you have too many entities it's better use this code

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

Upvotes: 2

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112392

Instead of openeing and closing the file all the time (because this what File.WriteAllText does at every call), prepare the text by using a string builder and write it to the file at once. Since the text comes from text boxes, I assume that the resulting string will not be very long anyway.

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());

Upvotes: 0

Thomas Weller
Thomas Weller

Reputation: 59302

You're close: there is File.AppendAllText() or File.AppendText(). You could also collect all lines in memory first and use File.AppendAllLines() (if you have enough RAM to store all lines).

WriteAllText() will write a new file or overwrite an existing one.

This will work well enough for smaller files, since the OS may apply some caching strategies. However, doing that in a loop for very large files may not be efficient. You should have a look at FileStreams then.

Upvotes: 3

I recommend use a 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());

Upvotes: 0

Lorek
Lorek

Reputation: 855

Use File.AppendText if you want to add to an existing file.

Upvotes: 0

Related Questions