StreamWriter kullanarak dosyaya satır ekleme


170

Dosyama satır eklemek istiyorum. Bir StreamWriter kullanıyorum:

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

Dosyamın çıktısı birbirinin altında birkaç dize olmalıdır, ancak bu kodu her çalıştırdığımda üzerine yazılan tek bir satır var.

StreamWriter'ın mevcut bir dosyaya eklenmesine izin vermenin bir yolu var mı?


19
Atmayı unutmayın StreamWriter. Bir usingblok bunun için daha iyi bir sözdizimidir.
TheCodeKing

1
Bu yüzden File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris

@TheCodeKing - Bunu yapmak için bana bazı kodlar gösterebilir misiniz?
Buhar

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

Yanıtlar:


279

Bunun yerine şunu kullanın:

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

StreamWriter yapıcısının bu aşırı yüklenmesi ile dosyayı eklemeyi veya üzerine yazmayı seçersiniz.

C # 4 ve üstü, bazılarının daha okunabilir bulduğu şu sözdizimini sunar:

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

Dosyaya her yazdığınızda yukarıdaki kodun tümünü yürüttüğünüzü varsayıyorum . Dosya akışı her açıldığında, arama işaretçisi başlangıçta konumlandırılır, böylece tüm yazma işlemleri daha önce orada olanların üzerine yazılır.

Sorunu iki şekilde çözebilirsiniz: ya uygun

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

veya akış işaretçisini açıkça kendiniz yeniden konumlandırarak:

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

dosya 10mb varsa ve ben konum 0, ancak sadece 10kb yazmaya başlarsa, dosyanın sadece yazdığım 10kb verilerini içerdiğinden nasıl emin olabilirim ?
JobaDiniz

10

Bunu dene:

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

7

Bunu değiştirin:

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

Bununla:

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

true metni eklediğini gösterir.



5

Başka bir seçenek System.IO.File.AppendText kullanıyor

Bu, başkalarının verdiği StreamWriter aşırı yüklemelerine eşdeğerdir.

Ayrıca File.AppendAllText , akışı açma ve kapatma konusunda endişelenmenize gerek kalmadan biraz daha kolay bir arayüz verebilir. Gerçi daha sonra kendi çizgilerinize girme konusunda endişelenmeniz gerekebilir. :)


5

Aslında BaseStream.Seek ile sadece Jon'un cevabı (5 Eylül 11: 37'de) davam için çalıştı. Teşekkürler Jon! Bir zip arşivlenmiş txt dosyasına satır eklemek gerekiyordu .

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

Daha basit bir yolu, File.AppendTextUTF-8 kodlu metni mevcut bir dosyaya veya belirtilen dosya mevcut değilse ve yeni bir dosyaya ekleyerekSystem.IO.StreamWriter

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

1

Bu satırı değiştirin:

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

bu kodla:

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

ve satırınızı aşağıdaki gibi metin dosyasına yazın:

sw.WriteLine("text content");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.