Nối các dòng vào tệp bằng StreamWriter


170

Tôi muốn nối các dòng vào tập tin của tôi. Tôi đang sử dụng StreamWriter:

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

Đầu ra của tệp của tôi phải là một vài chuỗi bên dưới nhau, nhưng tôi chỉ có một hàng, được ghi đè mỗi khi tôi chạy mã này.

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


19
Đừng quên vứt bỏ StreamWriter. Một usingkhối là cú pháp tốt hơn cho điều này.
TheCodeKing

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

@TheCodeKing - Bạn có thể chỉ cho tôi một số mã để làm điều đó không?
Hơi nước

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

Câu trả lời:


279

Sử dụng cái này thay thế:

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

Với sự quá tải này của hàm tạo StreamWriter bạn chọn nếu bạn nối thêm tệp hoặc ghi đè lên nó.

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

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

Tôi giả sử bạn đang thực thi tất cả các mã trên mỗi khi bạn viết một cái gì đó vào tệp. Mỗi khi luồng cho tệp được mở, con trỏ tìm kiếm của nó được định vị ở đầu để tất cả các ghi cuối cùng ghi đè lên những gì đã có trước đó.

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

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

hoặc bằng cách định vị lại rõ ràng con trỏ luồng:

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

Điều gì xảy ra nếu tệp có 10mb và tôi bắt đầu viết từ vị trí 0, nhưng chỉ 10kb, làm sao tôi có thể đảm bảo rằng tệp chỉ chứa dữ liệu 10kb tôi vừa viết?
JobaDiniz

10

Thử cái này:

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

7

Thay thế này:

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

Với cái này:

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

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



5

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

Điều này tương đương với quá tải StreamWriter mà những 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 các ngắt dòng của riêng bạn. :)


5

Trên thực tế chỉ có câu trả lời của Jon (ngày 5 tháng 9 năm 11 lúc 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 nối các dòng vào tệp txt 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");
        }
    }
}

3

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

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

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 tệp văn bản như thế này:

sw.WriteLine("text content");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.