2011-09-05 21 views
128

Chcę dodać linie do mojego pliku. Używam StreamWriter:Dołącz linie do pliku, używając StreamWriter

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

Wyjście moim pliku powinno być kilka ciągów poniżej siebie, ale mam tylko jeden wiersz, który jest zastępowane za każdym razem ten kod.

Czy istnieje sposób na dodanie StreamWriter do istniejącego pliku?

+15

Nie zapomnij dysponowania 'StreamWriter'. Blok 'using' jest lepszą składnią dla tego. – TheCodeKing

+1

Dlatego właśnie wolę nie martwić się strumieniami podczas wykonywania bardzo szybkich aktualizacji do pliku za pomocą File.AppendAllText - http://msdn.microsoft.com/en-us/library/ms143356.aspx – Chris

+0

@CodeKing - Can pokazujesz mi jakiś kod, żeby to zrobić? – Steam

Odpowiedz

213

Użyj tego zamiast:

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

Dzięki tej przeciążeniem konstruktora StreamWriter wybrać jeśli dołączyć plik lub nadpisać go.

C# 4 i powyżej oferuje następującą składnię, co niektórzy uważają, bardziej czytelne:

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

Wymień to:

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

z tym:

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

true wskazuje, że dołącza tekst.

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

Spróbuj tego:

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

Zakładam, że realizują wszystkie powyższego kodu za każdym razem piszesz coś do pliku. Za każdym razem, gdy strumień pliku jest otwierany, jego wskaźnik szukania jest umieszczony na początku, więc wszystkie zapisy kończą się nadpisaniem tego, co było wcześniej.

Można rozwiązać ten problem na dwa sposoby: albo z dogodnym

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

lub jawnie repozycjonowanie strumień wyżeł siebie:

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

co jeśli plik ma 10 MB i zaczynam pisać od pozycji 0, ale tylko 10kb, jak mogę zapewnić, że plik * tylko * zawiera dane 10kb, które właśnie napisałem? – JobaDiniz

5

Inną opcją jest użycie System.IO.File.AppendText

ten jest równoważne przeciążeniom StreamWriter, które otrzymały inne.

Również interfejs File.AppendAllText może dać nieco łatwiejszy interfejs, nie martwiąc się o otwarcie i zamknięcie strumienia. Chociaż może być konieczne, aby następnie martwić się o wprowadzanie własnych linebreaks. :)

4

Właściwie tylko Jona odpowiedź (Sep 5 '11 o 9:37) z BaseStream.Seek pracował dla mojego przypadku. Dzięki Jon! Potrzebowałem do dołożenia linii do pliku zarchiwizowanego pliku 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"); 
     } 
    } 
} 
1

Wymień ten wiersz:

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

z tym kodem:

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

a następnie napisać wiersz do pliku tekstowego jak ten:

sw.WriteLine("text content"); 
2

One More prosty sposób polega na użyciu File.AppendText dołącza UTF-8 zakodowany tekst do istniejącego pliku lub do nowego pliku, jeśli określony plik nie istnieje i zwraca System.IO.StreamWriter

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