ต่อท้ายบรรทัดในไฟล์โดยใช้ StreamWriter


170

ฉันต้องการต่อท้ายบรรทัดในไฟล์ของฉัน ฉันใช้ StreamWriter:

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

ผลลัพธ์ของไฟล์ของฉันควรมีหลาย ๆ สตริงด้านล่างซึ่งกันและกัน แต่ฉันมีเพียงหนึ่งแถวซึ่งถูกเขียนทับทุกครั้งที่ฉันเรียกใช้รหัสนี้

มีวิธีให้ StreamWriter ต่อท้ายไฟล์ที่มีอยู่หรือไม่?


19
StreamWriterอย่าลืมที่จะทิ้ง usingบล็อกเป็นไวยากรณ์ที่ดีสำหรับการนี้
TheCodeKing

1
นี่คือสาเหตุที่ฉันไม่ต้องการกังวลเกี่ยวกับสตรีมเมื่อทำการอัปเดตไฟล์โดยใช้ File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris

@TheCodeKing - คุณช่วยแสดงรหัสให้ฉันดูได้ไหม?
Steam

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

คำตอบ:


279

ใช้สิ่งนี้แทน:

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

ด้วยโอเวอร์โหลดของตัวสร้าง StreamWriter นี้คุณเลือกถ้าคุณต่อท้ายไฟล์หรือเขียนทับมัน

C # 4 ขึ้นไปมีไวยากรณ์ต่อไปนี้ซึ่งบางคนพบว่าอ่านได้มากขึ้น:

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


13

ผมถือว่าคุณกำลังดำเนินการทั้งหมดของโค้ดข้างต้นทุกครั้งที่คุณเขียนอะไรบางอย่างไปยังแฟ้ม ทุกครั้งที่กระแสข้อมูลสำหรับไฟล์ถูกเปิดตัวชี้การค้นหาจะอยู่ในตำแหน่งเริ่มต้นเพื่อให้การเขียนทั้งหมดจบลงด้วยการเขียนทับสิ่งที่เคยมีมาก่อน

คุณสามารถแก้ไขปัญหาได้สองวิธี: อย่างสะดวก

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

หรือโดยการเปลี่ยนตำแหน่งตัวชี้กระแสอย่างชัดเจน:

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

ถ้าไฟล์มี 10mb และฉันเริ่มเขียนจากตำแหน่ง 0 แต่เพียง 10kb ฉันจะมั่นใจได้อย่างไรว่าไฟล์นั้นมีเฉพาะข้อมูล 10kb ที่ฉันเพิ่งเขียน
JobaDiniz


7

แทนที่สิ่งนี้:

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

ด้วยสิ่งนี้:

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

true ระบุว่าจะต่อท้ายข้อความ



5

ตัวเลือกอื่นกำลังใช้System.IO.File.AppendText

สิ่งนี้เทียบเท่ากับ StreamWriter โอเวอร์โหลดที่คนอื่นได้ให้ไว้

นอกจากนี้ยังFile.AppendAllTextอาจให้อินเตอร์เฟซที่ง่ายขึ้นเล็กน้อยโดยไม่ต้องกังวลเกี่ยวกับการเปิดและปิดกระแส แม้ว่าคุณอาจจำเป็นต้องกังวลเกี่ยวกับการแพร่กระจายของคุณเอง :)


5

จริงๆแล้วมีเพียงคำตอบของจอน (5 ก.ย. '11 ที่ 9:37) ด้วย BaseStream.Seek ทำงานเพื่อกรณีของฉัน ขอบคุณจอน! ฉันต้องการต่อท้ายบรรทัดไปยังไฟล์ txt ที่เก็บถาวรใน 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

อีกวิธีที่ง่ายกว่าคือการใช้ข้อความต่อFile.AppendTextท้ายที่เข้ารหัส UTF-8 ไปยังไฟล์ที่มีอยู่หรือไปยังไฟล์ใหม่หากไฟล์ที่ระบุไม่มีอยู่และส่งคืนSystem.IO.StreamWriter

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

1

แทนที่บรรทัดนี้:

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

ด้วยรหัสนี้:

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

จากนั้นเขียนบรรทัดของคุณลงในไฟล์ข้อความดังนี้:

sw.WriteLine("text content");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.