Tambahkan baris ke file menggunakan StreamWriter


170

Saya ingin menambahkan baris ke file saya. Saya menggunakan StreamWriter:

StreamWriter file2 = new StreamWriter(@"c:\file.txt");
file2.WriteLine(someString);
file2.Close();

Output dari file saya harus beberapa string di bawah satu sama lain, tetapi saya hanya memiliki satu baris, yang ditimpa setiap kali saya menjalankan kode ini.

Apakah ada cara untuk membiarkan StreamWriter menambahkan ke file yang ada?


19
Jangan lupa buang StreamWriter. Sebuah usingblok sintaks yang lebih baik untuk ini.
TheCodeKing

1
Ini juga mengapa saya memilih untuk tidak khawatir tentang stream ketika melakukan pembaruan yang sangat cepat ke file dengan menggunakan File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris

@TheCodeKing - Bisakah Anda menunjukkan kepada saya beberapa kode untuk melakukan itu?
Uap

4
@blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing

Jawaban:


279

Gunakan ini sebagai gantinya:

new StreamWriter("c:\\file.txt", true);

Dengan kelebihan konstruktor StreamWriter ini Anda pilih jika Anda menambahkan file, atau menimpanya.

C # 4 dan di atas menawarkan sintaks berikut, yang menurut beberapa orang lebih mudah dibaca:

new StreamWriter("c:\\file.txt", append: true);

145
 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }

13

Saya menganggap Anda mengeksekusi semua kode di atas setiap kali Anda menulis sesuatu ke file. Setiap kali aliran untuk file dibuka, pointer pencariannya diposisikan di awal sehingga semua penulisan akhirnya menimpa apa yang ada di sana sebelumnya.

Anda dapat memecahkan masalah dengan dua cara: baik dengan nyaman

file2 = new StreamWriter("c:/file.txt", true);

atau dengan memposisikan sendiri penunjuk aliran secara eksplisit:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);

bagaimana jika file tersebut memiliki 10MB dan saya mulai menulis dari posisi 0, tetapi hanya 10 KB, bagaimana saya bisa memastikan bahwa file tersebut hanya berisi data 10 KB yang baru saja saya tulis?
JobaDiniz

10

Coba ini:

StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();

7

Ganti ini:

StreamWriter file2 = new StreamWriter("c:/file.txt");

dengan ini:

StreamWriter file2 = new StreamWriter("c:/file.txt", true);

true menunjukkan bahwa itu menambahkan teks.



5

Opsi lain menggunakan System.IO.File.AppendText

Ini sama dengan StreamWriter yang diberikan orang lain berlebihan.

File.AppendAllText juga dapat memberikan antarmuka yang sedikit lebih mudah tanpa harus khawatir tentang membuka dan menutup aliran. Meskipun Anda mungkin perlu khawatir tentang menempatkan di linebreak Anda sendiri. :)


5

Sebenarnya hanya jawaban Jon (5 Sep 11 'jam 9:37) dengan BaseStream. Carilah yang bekerja untuk kasus saya. Terima kasih jon! Saya perlu menambahkan baris ke file txt yang diarsipkan zip.

using (FileStream zipFS = new FileStream(@"c:\Temp\SFImport\test.zip",FileMode.OpenOrCreate))
{
    using (ZipArchive arch = new ZipArchive(zipFS,ZipArchiveMode.Update))
    {
        ZipArchiveEntry entry = arch.GetEntry("testfile.txt");
        if (entry == null)
        {
            entry = arch.CreateEntry("testfile.txt");
        }
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.BaseStream.Seek(0,SeekOrigin.End);
            sw.WriteLine("text content");
        }
    }
}

3

Satu lagi cara sederhana adalah menggunakan File.AppendTextitu menambahkan teks yang disandikan UTF-8 ke file yang ada, atau ke file baru jika file yang ditentukan tidak ada dan mengembalikanSystem.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt"))
{                                                
    sw.WriteLine("this is a log");
}

1

Ganti baris ini:

StreamWriter sw = new StreamWriter("c:/file.txt");

dengan kode ini:

StreamWriter sw = File.AppendText("c:/file.txt");

dan kemudian tulis baris Anda ke file teks seperti ini:

sw.WriteLine("text content");
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.