2011-09-05 57 views
128

Tôi muốn nối thêm các dòng vào tệp của mình. Tôi đang sử dụng một StreamWriter:Nối các dòng vào một tệp bằng cách sử dụng StreamWriter

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

Sản lượng của tập tin của tôi nên có một vài chuỗi bên dưới mỗi khác, nhưng tôi chỉ có một hàng, mà được ghi đè mỗi khi tôi chạy mã này.

Có cách nào để StreamWriter nối thêm vào tệp hiện có không?

+15

Đừng quên để xử lý 'StreamWriter'. Một khối 'using' là cú pháp tốt hơn cho việc này. – TheCodeKing

+1

Đây cũng là lý do tại sao tôi không muốn lo lắng về luồng khi thực hiện cập nhật rất nhanh cho một tệp bằng cách sử dụng File.AppendAllText - http://msdn.microsoft.com/en-us/library/ms143356.aspx – Chris

+0

@TheCodeKing - Có thể bạn chỉ cho tôi một số mã để làm điều đó? – Steam

Trả lời

213

Sử dụng này để thay thế:

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

Với tình trạng quá tải này của các nhà xây dựng StreamWriter bạn chọn nếu bạn thêm các tập tin, hoặc ghi đè lên nó.

C# 4 trở lên cung cấp cú pháp sau, mà một số tìm dễ đọc hơn:

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

Thay thế này:

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

với điều này:

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

true chỉ ra rằng nó nối thêm văn bản.

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

Hãy thử điều này:

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

tôi giả sử bạn đang thực hiện tất cả của các mã trên mỗi lần bạn viết một cái gì đó để các tập tin. Mỗi khi dòng cho tập tin được mở ra, con trỏ tìm kiếm của nó được đặt ở đầu để tất cả các ghi kết thúc ghi đè lên những gì đã có trước đó.

Bạn có thể giải quyết vấn đề theo hai cách: hoặc với thuận tiện

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

hoặc bằng cách tái định vị một cách rõ ràng dòng con trỏ tự hỏi:

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

nếu tệp có 10mb và tôi bắt đầu viết từ vị trí 0, nhưng chỉ 10kb, làm cách nào tôi có thể đảm bảo rằng tệp * chỉ * chứa dữ liệu 10kb mà tôi vừa mới viết? – JobaDiniz

5

Một lựa chọn khác là sử dụng System.IO.File.AppendText

này tương đương với quá tải StreamWriter mà người khác đã đưa ra.

Ngoài ra File.AppendAllText có thể cung cấp giao diện dễ dàng hơn một chút mà không phải lo lắng về việc mở và đóng luồng. Mặc dù bạn có thể cần phải lo lắng về việc đưa vào dòng sản phẩm của riêng bạn. :)

4

Thực tế chỉ có câu trả lời của Jon (ngày 5 tháng 9 năm 11: 9:37) với BaseStream.Seek đã làm việc cho trường hợp của tôi. Cảm ơn Jon! Tôi cần phải nối thêm dòng vào tệp zip được lưu trữ 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

Thay thế dòng này:

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

với mã này:

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

và sau đó viết dòng của bạn vào file văn bản như thế này:

sw.WriteLine("text content"); 
2

Một hơn cách đơn giản là sử dụng.210 nó gắn UTF-8 mã hóa văn bản vào một tập tin hiện có, hoặc vào một tập tin mới nếu tập tin được chỉ định không tồn tại và trả về một System.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt")) 
{             
    sw.WriteLine("this is a log"); 
} 
Các vấn đề liên quan